Mockito ведет себя странно, когда я назначаю несколько пользовательских сопоставителей одному методу.

Я хочу использовать два пользовательских сопоставителя для одного метода. По сути, если я передаю метод ЗНАЧЕНИЕ _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 (), но мои сопоставители работают именно так, как должны.

Так в чем же дело? Почему это происходит? Является ли моя работа -адекватным способом компенсации этого причудливого поведения, или я делаю это неправильно?

6
задан sangfroid 26 April 2012 в 22:45
поделиться