Я хочу использовать два пользовательских совпадения для одного метода. В принципе, если я передаю метод VALUE_A, я хочу, чтобы он возвращал RESULT_A, и если я передаю его VALUE_B, я хочу, чтобы он возвращал RESULT_B. Так вот фрагмент коды:Mockito действует странно, когда я назначаю несколько пользовательских совпадений для одного метода
class IsNonEmpty extends ArgumentMatcher<Get> {
public boolean matches(Object get) {
//For some reason, this method is called when I assign the IsEmpty matcher to MockHtable.get()
//When this happens, the value of the get argument is null, so this method throws an NPE
return Arrays.equals(((Get) get).getRow(), SERIALIZATION_HELPER.getValidBytes(key));
}
}
class IsEmpty extends ArgumentMatcher<Get> {
public boolean matches(Object get) {
return !(Arrays.equals(((Get) get).getRow(), SERIALIZATION_HELPER.getValidBytes(key)));
}
}
[...]
//This line executes just fine
Mockito.when(mockHTable.get(Mockito.argThat(new IsNonEmpty()))).thenReturn(dbResult);
[...]
//This line calls IsNonEmpty.matches() for some reason. IsNonEmpty.matches() throws an NPE
Mockito.when(mockHTable.get(Mockito.argThat(new IsEmpty()))).thenReturn(emptyResult);
Когда я назначить IsEmpty пользовательского Искатель к методу mockHTable.get(), это вызывает IsNonEmpty.matches функции(). Не знаю, почему это делается. Поэтому я перехожу к классу IsNonEmpty:
class IsNonEmpty extends ArgumentMatcher<Get> {
public boolean matches(Object get) {
//For some reason, this method is called when I assign the IsEmpty matcher. Weird, no?
if(get == null) {
return false;
}
return Arrays.equals(((Get) get).getRow(), SERIALIZATION_HELPER.getValidBytes(key));
}
}
а потом все работает просто отлично! IsNonEmpty.matches() все еще вызывается, когда я назначаю элемент IsEmpty для функции mockHTable.get(), но мои ответчики работают точно так, как должны.
Итак, в чем заключена сделка? Почему это происходит? Является ли мой рабочий подход адекватным способом компенсировать это причудливое поведение, или я делаю это неправильно?