앱 테스트 : postman 앱 사용할거임
package org.example.controller;
import lombok.AllArgsConstructor;
import org.example.repository.model.TodoEntity;
import org.example.repository.model.TodoResponse;
import org.example.service.TodoService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@CrossOrigin
@AllArgsConstructor
@RestController
@RequestMapping("/")
public class TodoController {
private final TodoService service;
@PostMapping
public ResponseEntity<TodoResponse> create(){
System.out.println("CREATE");
return null;
}
@GetMapping
public ResponseEntity<TodoResponse> readOne(){
System.out.println("Read One");
return null;
}
@GetMapping
public ResponseEntity<List<TodoResponse>> readAll(){
System.out.println("Read All");
return null;
}
@PatchMapping("{id}")
public ResponseEntity<TodoResponse> update(){
System.out.println("update");
return null;
}
@DeleteMapping("{id}")
public ResponseEntity<TodoResponse> deleteOne(){
System.out.println("Delete");
return null;
}
@DeleteMapping
public ResponseEntity<?> deleteAll(){
System.out.println("Delete All");
return null;
}
}
package org.example;
import org.example.repository.TodoRepository;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class TodoServerApplication {
public static void main(String[] args) {
SpringApplication.run(TodoServerApplication.class, args);
}
}
package org.example.controller;
import lombok.AllArgsConstructor;
import org.example.repository.model.TodoEntity;
import org.example.repository.model.TodoRequest;
import org.example.repository.model.TodoResponse;
import org.example.service.TodoService;
import org.springframework.http.ResponseEntity;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.stream.Collectors;
@CrossOrigin
@AllArgsConstructor
@RestController
@RequestMapping("/")
public class TodoController {
private final TodoService service;
@PostMapping
public ResponseEntity<TodoResponse> create(@RequestBody TodoRequest request){
System.out.println("CREATE");
if(ObjectUtils.isEmpty(request.getTitle()))
return ResponseEntity.badRequest().build();
if(ObjectUtils.isEmpty(request.getOrder()))
request.setOrder(0L); // 없어도 오류는 아니니 default로 set
if(ObjectUtils.isEmpty(request.getCompleted()))
request.setCompleted(false);
TodoEntity result = this.service.add(request);
return ResponseEntity.ok(new TodoResponse(result));
}
@GetMapping("{id}")
public ResponseEntity<TodoResponse> readOne(@PathVariable Long id){
System.out.println("Read One");
TodoEntity result = this.service.searchById(id);
return ResponseEntity.ok(new TodoResponse(result));
}
@GetMapping
public ResponseEntity<List<TodoResponse>> readAll(){
System.out.println("Read All");
List<TodoEntity> list = this.service.searchAll();
List<TodoResponse> response = list.stream().map(TodoResponse::new)
.collect(Collectors.toList()); // list로 return
// https://dpdpwl.tistory.com/81
// https://tourspace.tistory.com/7
// https://mong9data.tistory.com/130
// Stream 을 이용하여 람다함수형식으로 간결하고 깔끔하게 요소들의 처리가 가능
return ResponseEntity.ok(response);
}
@PatchMapping("{id}")
public ResponseEntity<TodoResponse> update(@PathVariable Long id, @RequestBody TodoRequest request){
System.out.println("update");
TodoEntity result = this.service.updateById(id, request);
return ResponseEntity.ok(new TodoResponse(result));
}
@DeleteMapping("{id}")
public ResponseEntity<TodoResponse> deleteOne(@PathVariable Long id){
System.out.println("Delete");
this.service.deleteById(id);
return ResponseEntity.ok().build();
}
@DeleteMapping
public ResponseEntity<?> deleteAll(){
System.out.println("Delete All");
this.service.deleteAll();
return ResponseEntity.ok().build();
}
}
>> http://localhost:8080 >> 여기서 통과하면 front올릴준비 다된거
>> 밑에꺼에서암거나 빨간거들가서
>> 여기 주소를 http://localhost:8080으로 바꾸면
package org.example.service;
import org.example.repository.TodoRepository;
import org.example.repository.model.TodoEntity;
import org.example.repository.model.TodoRequest;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.AdditionalAnswers;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.web.server.ResponseStatusException;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.when;
@ExtendWith({MockitoExtension.class})
class TodoServiceTest {
@Mock
private TodoRepository todoRepository;
@InjectMocks
private TodoService todoService;
@Test
void add() {
when(this.todoRepository.save(any(TodoEntity.class)))
.then(AdditionalAnswers.returnsFirstArg());//entity값 return
TodoRequest expected = new TodoRequest();
expected.setTitle("Test Title");
TodoEntity actual = this.todoService.add(expected);
// 넣은 값과 실제 반환값이 같은가 확인하기
assertEquals(expected.getTitle(), actual.getTitle());
}
@Test
void searchById() {
// findById >> optional 을 반환하므로 optional로 return값 넣어줌
TodoEntity entity = new TodoEntity();
entity.setId(123L);
entity.setTitle("TITLE");
entity.setOrder(0L);
entity.setCompleted(false);
Optional<TodoEntity> optional = Optional.of(entity);
given(this.todoRepository.findById(anyLong()))
.willReturn(optional);
TodoEntity actual = this.todoService.searchById(123L);
TodoEntity expected = optional.get();
assertEquals(expected.getId(), actual.getId());
assertEquals(expected.getTitle(), actual.getTitle());
assertEquals(expected.getOrder(), actual.getOrder());
assertEquals(expected.getCompleted(), actual.getCompleted());
}
@Test
public void searchByIdFailed() {
//없는값 조회했을때 에러가 잘 발생하는가 테스트용
given(this.todoRepository.findById(anyLong()))
.willReturn(Optional.empty());
assertThrows(ResponseStatusException.class, () -> {
this.todoService.searchById(123L);
});
}
}
package org.example.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.example.repository.model.TodoEntity;
import org.example.repository.model.TodoRequest;
import org.example.service.TodoService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest(TodoController.class)
class TodoControllerTest {
@Autowired
MockMvc mvc;
@MockBean
TodoService todoService;
private TodoEntity expected;
@BeforeEach
void setup() {
this.expected = new TodoEntity(); //초기화작업임
this.expected.setId(123L);
this.expected.setTitle("Test Title");
this.expected.setOrder(0L);
this.expected.setCompleted(false);
}
@Test
void create() throws Exception {
when(this.todoService.add(any(TodoRequest.class)))
.then((i) -> {
TodoRequest request = i.getArgument(0, TodoRequest.class);
return new TodoEntity(this.expected.getId(),
request.getTitle(),
this.expected.getOrder(),
this.expected.getCompleted());
});
TodoRequest request = new TodoRequest();
request.setTitle("Any Title");
ObjectMapper mapper = new ObjectMapper();
String content = mapper.writeValueAsString(request);
this.mvc.perform(post("/")
.contentType(MediaType.APPLICATION_JSON)
.content(content))
.andExpect(status().isOk())
.andExpect(jsonPath("$.title").value("Any Title"));
}
@Test
void readOne() {
}
}
ch4~5. 리팩토링, 디버깅 (0) | 2022.07.23 |
---|---|
ch3.2~ 모델, repository, 서비스코드 구현 (0) | 2022.07.21 |
ch3.1~ todo_ap server (0) | 2022.07.13 |
댓글 영역