bei*_*jxu 4 predicate mockito java-8
我有两节课:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
在我的单元测试中,我需要模拟ClassA,所以我使用Mockito的模拟方法,如下所示:
ClassA mockObjectA = Mockito.mock(ClassA.class);
Mockito.when(mockObjectA).methodA("some id", PredicatesProvider.isUserValid()).thenReturn("something");
Run Code Online (Sandbox Code Playgroud)
Mockito无法找到签名匹配.
The java.lang.AssertionError: expected:<PredicatesProvider$$Lambda$5/18242360@815b41f> but was:<PredicatesProvider$$Lambda$5/18242360@5542c4ed>
Run Code Online (Sandbox Code Playgroud)
这是我想要实现的简化版本.我猜这是谓词的equals()函数的问题.知道如何模拟具有谓词参数的方法吗?
谢谢
JB *_*zet 11
我看到4种可能的解决方案
始终从您的isUserValid()方法返回完全相同的Predicate实例.由于Predicate是无状态的,所以这不是问题.
将Predicate实现为一个真正的类,实现equals()和hashCode().但与第一种解决方案相比,这太过分了.
使用匹配器:
Mockito.when(mockObjectA).methodA(Mockito.eq("some id"), Mockito.<Predicate<User>>anyObject()).thenReturn("something");
Run Code Online (Sandbox Code Playgroud)不要使用静态方法来创建谓词,而是使用可注入的工厂,可以模拟和验证:
PredicatesProvider mockPredicatesProvider = mock(PredicatesProvider.class);
Predicate<User> expectedPredicate = (u -> true);
when(mockPredicatesProvider.isUserValid()).thenReturn(expectedPredicate);
when(mockObjectA).methodA("some id", expectedPredicate).thenReturn("something");
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
7241 次 |
| 最近记录: |