문서의 이전 판입니다!
argThat
과 ArgumentMatcher를 조합하여 동적인 인자 비교가 가능하다. when
과 verify
에서 모두 사용가능하다.
이를 사용하면 특히 테스트 대상 메소드 내부에서 직접 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(....));
@RunWIth
없이 일괄 @Mock
객체 생성하기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 애노테이션 붙은 필드에 객체들이 생서됨 ... } }