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 값을 사용해 객체를 생성해 반환할 수 있다.