급하게 2월3일까지 제출해야하는 자소서를 작성하고 다시 공부를 시작을하려고 한다.
이번 fastcampus 강의에는 Controller 작성과 TestCode작성하는 것에 대해서 공부했다.
@CrossOrigin
@AllArgsConstructor
@RequestMapping("/")
@RestController
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);
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());
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<?> 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();
}
}
컨트롤러를 작성후 PostMan으로 Create 부분을 테스트 했더니 오류가 발생했었다.
그래서 확인을 해보니 코드상에서 내가 오타를 적어서... 발생한 사소한 오류였다..
다음부터는 잘보고 작성을 해야겠다.. ㅎㅎ
@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());
TodoRequest expected =new TodoRequest();
expected.setTitle("Test Title");
TodoEntity actual = this.todoService.add(expected);
assertEquals(expected.getTitle(),actual.getTitle());
}
@Test
void searchById() {
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);
});
}
}
여기에서는 Mock을 이용해서 직접 DB에 있는 데이터를 사용하지않고 테스트를 진행을 하였다.
패스트 캠퍼스 강사분께서 Mock을 사용하는 이유에 대해서 설명을 해주셔서 간단하게 정리를 해봤다
컴퓨터 프로그래밍 개발 단계중에 발생하는 시스템의 논리적 오류나 비정상적인 오류를 찾아 원인을 밝히고 수정하는 자업과정을 말한다.
즉, 로그나 println처럼 직접실행해서 찾는거도 가능하지만 디버깅이 훨씬 편하다고 강의를 해주셨다.