Java 单元测试模拟一个以谓词作为参数的方法
Java unit test mock a method with predicate as an argument
我有两个类:
ClassA {
public String methodA(String accountId, Predicate<User> predicate) {
// more code
};
}
ClassB {
methodB(){
ClassA objectA = new ClassA();
objectA.methodA("some id", PredicatesProvider.isUserValid());
// more code ...
}
}
class PredicatesProvider {
static Predicate<User> isUserValid(){
return (user) -> {
return user.isValid();
}
}
在我的单元测试中,我需要模拟ClassA,所以我使用Mockito的模拟方法如下:
ClassA mockObjectA = Mockito.mock(ClassA.class);
Mockito.when(mockObjectA).methodA("some id", PredicatesProvider.isUserValid()).thenReturn("something");
Mockito 找不到匹配的签名。
The java.lang.AssertionError: expected:<PredicatesProvider$$Lambda/18242360@815b41f> but was:<PredicatesProvider$$Lambda/18242360@5542c4ed>
这是我正在努力实现的一种简化版本。我猜这是 predicate 的 equals() 函数的问题。知道如何模拟具有谓词参数的方法吗?
谢谢
我看到 4 种可能的解决方案:
始终 return 来自您的 isUserValid()
方法的完全相同的 Predicate 实例。由于 Predicate 是无状态的,所以这不是问题。
将谓词实现为真正的 class,实现 equals() 和 hashCode()。但与第一个解决方案相比,这太过分了。
使用匹配器:
Mockito.when(mockObjectA).methodA(Mockito.eq("some id"), Mockito.<Predicate<User>>anyObject()).thenReturn("something");
不要使用静态方法创建谓词,而是使用可注入工厂,您可以模拟和验证:
PredicatesProvider mockPredicatesProvider = mock(PredicatesProvider.class);
Predicate<User> expectedPredicate = (u -> true);
when(mockPredicatesProvider.isUserValid()).thenReturn(expectedPredicate);
when(mockObjectA).methodA("some id", expectedPredicate).thenReturn("something");
我有两个类:
ClassA {
public String methodA(String accountId, Predicate<User> predicate) {
// more code
};
}
ClassB {
methodB(){
ClassA objectA = new ClassA();
objectA.methodA("some id", PredicatesProvider.isUserValid());
// more code ...
}
}
class PredicatesProvider {
static Predicate<User> isUserValid(){
return (user) -> {
return user.isValid();
}
}
在我的单元测试中,我需要模拟ClassA,所以我使用Mockito的模拟方法如下:
ClassA mockObjectA = Mockito.mock(ClassA.class);
Mockito.when(mockObjectA).methodA("some id", PredicatesProvider.isUserValid()).thenReturn("something");
Mockito 找不到匹配的签名。
The java.lang.AssertionError: expected:<PredicatesProvider$$Lambda/18242360@815b41f> but was:<PredicatesProvider$$Lambda/18242360@5542c4ed>
这是我正在努力实现的一种简化版本。我猜这是 predicate 的 equals() 函数的问题。知道如何模拟具有谓词参数的方法吗?
谢谢
我看到 4 种可能的解决方案:
始终 return 来自您的
isUserValid()
方法的完全相同的 Predicate 实例。由于 Predicate 是无状态的,所以这不是问题。将谓词实现为真正的 class,实现 equals() 和 hashCode()。但与第一个解决方案相比,这太过分了。
使用匹配器:
Mockito.when(mockObjectA).methodA(Mockito.eq("some id"), Mockito.<Predicate<User>>anyObject()).thenReturn("something");
不要使用静态方法创建谓词,而是使用可注入工厂,您可以模拟和验证:
PredicatesProvider mockPredicatesProvider = mock(PredicatesProvider.class); Predicate<User> expectedPredicate = (u -> true); when(mockPredicatesProvider.isUserValid()).thenReturn(expectedPredicate); when(mockObjectA).methodA("some id", expectedPredicate).thenReturn("something");