사용자 도구

사이트 도구


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.1588746233.txt.gz · 마지막으로 수정됨: 2020/05/06 15:23 저자 kwon37xi