Я хочу использовать два пользовательских сопоставителя для одного метода. По сути, если я передаю метод ЗНАЧЕНИЕ _A, я хочу, чтобы он возвращал РЕЗУЛЬТАТ _A, а если я передаю ему ЗНАЧЕНИЕ _B, я хочу, чтобы он возвращал РЕЗУЛЬТАТ _B. Итак, вот код отрывок:
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 (), но мои сопоставители работают именно так, как должны.
Так в чем же дело? Почему это происходит? Является ли моя работа -адекватным способом компенсации этого причудливого поведения, или я делаю это неправильно?