사용자 도구

사이트 도구


java:mockito

Mockito

argThat

argThatArgumentMatcher를 조합하여 동적인 인자 비교가 가능하다. whenverify에서 모두 사용가능하다.

이를 사용하면 특히 테스트 대상 메소드 내부에서 직접 new로 생성한 값에 대해 when에서 ArgumentCaptor없이 비교가능하여 불필요한 verify호출을 줄일 수 있다.

ArgumentMatcher 문서를 참조하면 된다.

class IsListOfTwoElements extends ArgumentMatcher<List> {
    public boolean matches(Object list) {
        return ((List) list).size() == 2;
    }
}
List mock = mock(List.class);
 
when(mock.addAll(argThat(new IsListOfTwoElements()))).thenReturn(true);
 
mock.addAll(Arrays.asList("one", "two"));
 
verify(mock).addAll(argThat(new IsListOfTwoElements()));

가능하면 argThat 부분을 메소드로 빼서 인자를 받아 ArgumentMatcher를 구성하는 것이 좋다. 아래는 문자열 List를 인자로 받을 때, 해당 리스트의 값이 모두 포함돼 있는지 검사하는 Matcher.

private List<String> sameStringList(final Collection<String> strings) {
    return argThat(new ArgumentMatcher<List<String>>() {
        @Override
        public boolean matches(Object argument) {
            List<String> args = (List<String>) argument;
            return args.size() == strings.size() && args.containsAll(strings);
        }
    });
}

when에서 동일한 모의 객체의 동일한 메소드를 두 번이상 argThat으로 호출하면 오류가 발생할 수 있다. 이 때는 doReturn 방식으로 when을 구성한다.

doReturn(리턴값).when(mockObject).mockMethod(argThat(....));

initMocks

public class CalculatorApplicationTestInitMocks {
    @Mock private Adder adderMock;
    @Mock private Subtracter subtracterMock;
    @Mock private Multiplier multiplierMock;
    @Mock private Divisor divisorMock;
 
    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this); // 테스트 클래스의 @Mock 애노테이션 붙은 필드에 객체들이 생서됨
        ...
    }
}

참고

java/mockito.txt · 마지막으로 수정됨: 2016/06/09 12:13 저자 kwon37xi