Inertia

mockito

보통 디펜던시는 줄이는게 좋은 프랙티스로 인정받지만 실제 구현에서 디펜던시가 없을 수는 없다. 그래서 unit test를 작성할때 그런 dependency를 가지는 클래스들도 다 설정을 해야 해서 테스트가 어려워지는 문제가 있는데 이것을 획기적으로 해결한 것이 Mockito라는 프레임웍이다.

기본적으로 dynamic하게 class단위 mocking을 제공해서 내가 원하는 리턴값을 주게끔 하는 라이브러리인데 관심 있는 클래스의 로직만 테스트하기에는 이만한 것이 없다.

maven

메이븐 디펜던시는 아래처럼. spring boot의 경우도 1.5의 경우는 override를 해줘야 하는데, 아래처럼 모키토 버전만 잡아주면 된다.

1
2
3
4
5
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.15.0</version>
</dependency>

mocking

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class MyTest{
@MockBean
private MessageRepository repository;
private MessageService service;

@Test
public void testGetMessages() {
String pid = "testUser";
String msg = "msg";

when(repository.getMessage(pid)).thenReturn(msg);
when(repository.getAllMessage(Mockito.anyString()))
.thenReturn(null);

assertTrue(service.getMessage(pid)==msg);
}
}

ArgumentMatcher

java8의 람다를 사용하면 ArgumentMatcher가 아주 나이스해지는데 아래 경우를 보자. 참고로 람다지원은 mockito 2.1.0 이후부터 가능하다.

1
2
3
4
5
6
7
8
verify(list, times(2)).add(argThat(string -> string.length() < 5));

// Java 7 equivalent - not as neat
verify(list, times(2)).add(argThat(new ArgumentMatcher(){
public boolean matches(String arg) {
return arg.length() < 5;
}
}));

Reference