Tôi muốn sử dụng hai đối sánh tùy chỉnh cho một phương thức. Về cơ bản, nếu tôi vượt qua phương thức VALUE_A, tôi muốn nó trả về RESULT_A, và nếu tôi vượt qua nó VALUE_B, tôi muốn nó trả về RESULT_B. Vì vậy, đây là một mã số trích đoạn:Mockito hoạt động lạ khi tôi gán nhiều đối sánh tùy chỉnh cho một phương thức đơn lẻ
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);
Khi tôi giao cho tùy chỉnh khớp IsEmpty phương pháp mockHTable.get(), nó gọi là IsNonEmpty.matches() chức năng. Không có ý tưởng tại sao nó làm điều này. Vì vậy, tôi thay đổi lớp IsNonEmpty thành lớp này:
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));
}
}
và sau đó mọi thứ hoạt động tốt! IsNonEmpty.matches() vẫn được gọi khi tôi gán đối sánh IsEmpty với hàm mockHTable.get(), nhưng các trình đối sánh của tôi hoạt động chính xác như thế nào.
Vậy thỏa thuận là gì? Lý do tại sao điều này xảy ra? Là công việc của tôi xung quanh một cách đầy đủ để bù đắp cho hành vi kỳ quặc này, hoặc tôi làm điều đó sai?