ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Mockito로 도대체 뭘 테스트해야 하는 건데?
    Today I Learned 2022. 8. 23. 23:58

     

    10주차 Spring Data 강의들 중 객체의 영속화를 다루는 강의를 보면 직접 구현했던 Repository를 JpaRepository를 상속받는 Interface로 구조를 바꾸는 부분이 있다.

     

    기존에 만들어두었던 Repository의 메서드들은 모두 JpaRepository의 인터페이스 내부의 메서드들에 맞게 네이밍되어 있고 기능도 같아 Service나 Controller의 구조가 변경될 일은 없었다. 하지만 테스트 코드는 이야기가 달랐다.

     

    기존에는 테스트 상황을 만들어주기 위해 테스트 메서드에서 직접 Repository 인스턴스를 선언하고 미리 데이터를 테스트에 맞게 설정해놓는 등 테스트 상황을 미리 만들어놓았었는데, Repository가 Interface가 되다 보니 그런 식으로 인스턴스를 만드는 게 불가능해지면서 테스트 코드도 그에 맞게 변경되어야 했다. 예를 들어 POST 요청으로 받아온 postDto 인스턴스를 Post로 변환해 PostRepository에 저장하도록 하는 PostService의 메서드 create에 대한 테스트의 구조가 다음과 같이 변경되었다

     

    기존의 구조는 다음과 같이 Repository 인스턴스를 미리 생성한 뒤 테스트를 수행하는 식이었는데,

    @Test
      void create() {
        PostRepository postRepository = new PostRepository();
    
        PostService postService = new PostService(postRepository);
    
        PostDto postDto = postService.create(
            new PostDto("Tester", "New Post", "Hello~"));
            
        assertThat(postDto.getId()).isNotNull();
        assertThat(postDto.getAuthor()).isEqualTo("Tester");
      }

     

    PostRepository를 가짜 mock 객체로 만든 뒤, 미리 상황을 가정해놓는 식으로 (?) 구조 변경이 이루어졌다.

    @Test
      void create() {
        PostRepository postRepository = mock(PostRepository.class);
        
        given(postRepository.save(any(Post.class)))
            .willReturn(new Post(1L, "Tester", "New Post", "Hello~"));
            
        PostService postService = new PostService(postRepository);
        
        PostDto postDto = postService.create(
            new PostDto("Tester", "New Post", "Hello~"));
            
        assertThat(postDto.getId()).isNotNull();
        assertThat(postDto.getAuthor()).isEqualTo("Tester");
      }

     

     

    커밋

     

    이후 내용 추가 예정 요약본

     

    - 퀘스트 과제의 delete를 Service에서 처리하는 테스트 코드를 짜는데 mock의 상태값을 미리 세팅하려고 했는데 잘 안되서 고통받았음

     

    - 동료들하고 얘기를 해봤는데, 값의 변경 상태를 따지는 것은 이미 잘 만들어져 있는 JpaRepository가 똑바로 작동하는지를 다시 검증하겠다는 게 아닌가 하는 생각이 들었음

     

    - JpaRepository가 똑바로 작동한다는 것을 기저에 확실하게 박아놓는다면 우리는 Service가 Repository의 인터페이스 메서드를 설계한 대로 호출하는지만 체크하면 됨 (verify 메서드 같은 것으로), 의도한 대로 호출하는 것을 확인할 수 있다면 JpaRepository는 당연히 잘 작동할 테니까 Service의 로직 역시 검증되는 것임

     

    - 즉 Service의 테스트에서는 Service의 로직이 잘 작동되는지 확인하는 것에 집중해야 함

     

    - 테스트 코드를 짤 때 이 테스트 코드가 진짜 검증해야 하는 게 무엇인가를 생각해야 할 것임을 느낌

     

     

     

    'Today I Learned' 카테고리의 다른 글

    속도차이  (0) 2022.08.25
    조금 다른 선택과 집중  (0) 2022.08.24
    일일 목표 달성 실패 악령을 떨쳐내야 한다  (0) 2022.08.20
    소소한 TIL  (0) 2022.08.19
    이제는 솔로이스트 정신을 내려놓을 때  (0) 2022.08.18

    댓글

Designed by Tistory.