[오늘의 배움] 목 입력 값 기반으로 반환하기

이상민·2022년 2월 9일
0

[오늘의 배움]

목록 보기
68/70
post-thumbnail

Junit을 사용하면서 목 프레임워크로 Mockito를 자주 같이 사용한다. 가장 간단하게는 다음처럼 사용할 수 있다.

@ExtendWith(MockitoExtension.class)
class SomeTest {

    @InjectMocks
    private Service sut;
    
    @Mock
    private Repository mockRepo;

    @Test
    @Displayname("저장소에서 객체를 생성한다")
    void getValueFromRepo() {
        // given
        long id = 1L;
        
        Object obj = new Object(id);
        given(mockRepo.getOne(anyLong())).willReturn(object);
            
        // when
        Object maybeObj = sut.getOne(id);
        
        // then
        assertThat(obj, samePropertyValuesAs(maybeObj));
    }
}

위의 mockRepo는 어떤 id 값을 받아도 동일한 객체를 반환한다. 만약 목의 입력 값에 따라 응답을 다르게 하려면 어떻게 해야할까? 단순하게는 동일한 메소드를 여러번 목킹할 수 있다.

...

given(mockRepo.getOne(1L)).willReturn(new Object(1L));
given(mockRepo.getOne(2L)).willReturn(new Object(2L));
given(mockRepo.getOne(3L)).willReturn(new Object(3L));

...

동일한 메소드를 여러번 목킹하면 given절이 길어저 테스트 코드의 가독성이 떨어지며, 관리도 어려워진다. 이러한 이유로 위와 같은 테스트 코드를 컴파일 시 경고를 반환하며 실패한다. lenient 옵션을 줘 이런 경고를 무시하고 실행할 수도 있지만, 이럴 경우 사용하지 않는 목을 체크해주는 옵션 등도 같이 꺼버리게 된다. 따라서 아래와 같이 해보자

given(mockRepo.getOne(anyLong()))
              .willAnswer(id -> new Object(id)));

getOne() 메소드의 인자로 들어오는 long 값을 사용해 객체를 생성해 반환할 수 있다.

profile
편하게 읽기 좋은 단위의 포스트를 추구하는 개발자입니다

0개의 댓글