1 つのメソッドに対して 2 つのカスタム マッチャーを使用したいと考えています。基本的には、メソッドに VALUE_A を渡せば RESULT_A を返したいし、VALUE_B を渡せば RESULT_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() 関数に割り当てたときに引き続き呼び出されますが、マッチャーは本来の方法で正確に動作します。
それで、取引は何ですか?なぜこれが起こるのですか?私の回避策は、この風変わりな動作を補う適切な方法ですか、それとも間違っていますか?