2022/02/03 TODO-List 구현해보기-2

김석진·2022년 2월 3일
0

급하게 2월3일까지 제출해야하는 자소서를 작성하고 다시 공부를 시작을하려고 한다.
이번 fastcampus 강의에는 Controller 작성과 TestCode작성하는 것에 대해서 공부했다.

Controller 부분

@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 부분을 테스트 했더니 오류가 발생했었다.
그래서 확인을 해보니 코드상에서 내가 오타를 적어서... 발생한 사소한 오류였다..
다음부터는 잘보고 작성을 해야겠다.. ㅎㅎ

TestCode

ServiceTestCode

@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을 사용하는 이유에 대해서 설명을 해주셔서 간단하게 정리를 해봤다

테스트 시 MOCK을 사용하는 이유

  1. 외부 시스템에 의존하지 않고 자체 시스템 테스트를 할때 Mock을 사용
  2. 실제 데이터베이스를 사용하게 되면 테스트 할때마다 DB에 수정이 일어나기 때문에 서비스에 사용중인 데이터를 함부러 건들게 되면 문제가 생기기 떄문에 MOCK을 사용한다
    솔직히 무슨 말인지 모르겠다. 그냥 Test를 할때 직접 DB에 있는 데이터를 수정하면 아주큰일이난다..라는것은 알겠다. 지금 내가하는 프로젝트같은 경우에는 내가 DB를 만들고 수정하면되지만 현업에서는 DB의 내용에 따라 서비스가 문제가 생길수 있어서 MOCK을 사용하는것같다.. 더 자세히 알아보고 포스팅을 해야겠다

디버깅

디버깅이란?

컴퓨터 프로그래밍 개발 단계중에 발생하는 시스템의 논리적 오류나 비정상적인 오류를 찾아 원인을 밝히고 수정하는 자업과정을 말한다.
즉, 로그나 println처럼 직접실행해서 찾는거도 가능하지만 디버깅이 훨씬 편하다고 강의를 해주셨다.

profile
주니어 개발자 되고싶어요

0개의 댓글

관련 채용 정보