Java 8 Java单元测试模拟以谓词作为参数的方法

Java 8 Java单元测试模拟以谓词作为参数的方法,java-8,mockito,predicate,Java 8,Mockito,Predicate,我有两门课: ClassA { public String methodA(String accountId, Predicate<User> predicate) { // more code }; } ClassB { methodB(){ ClassA objectA = new ClassA(); objectA.methodA("some id", PredicatesProvider.isUserValid());

我有两门课:

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();
   }
}
Mockito找不到签名匹配

The java.lang.AssertionError: expected:<PredicatesProvider$$Lambda$5/18242360@815b41f> but was:<PredicatesProvider$$Lambda$5/18242360@5542c4ed>
java.lang.AssertionError:应为:但为:
这是我试图实现的一种简化版本。我想这是谓词的equals()函数的一个问题。知道如何模拟具有谓词参数的方法吗


谢谢

我看到了4种可能的解决方案:

  • 始终从
    isUserValid()
    方法返回完全相同的谓词实例。因为谓词是无状态的,所以这不是问题

  • 将谓词实现为实类,实现equals()和hashCode()。但与第一种解决方案相比,这太过分了

  • 使用匹配器:

     Mockito.when(mockObjectA).methodA(Mockito.eq("some id"), Mockito.<Predicate<User>>anyObject()).thenReturn("something");
    
    Mockito.when(mockObjectA.methodA(Mockito.eq(“some id”),Mockito.anyObject())。然后返回(“某物”);
    
  • 不要使用静态方法来创建谓词,而是使用可注入工厂来模拟和验证:

    PredicatesProvider mockPredicatesProvider = mock(PredicatesProvider.class);
    Predicate<User> expectedPredicate = (u -> true);
    when(mockPredicatesProvider.isUserValid()).thenReturn(expectedPredicate);
    when(mockObjectA).methodA("some id", expectedPredicate).thenReturn("something");
    
    PredicatesProvider mockPredicatesProvider=mock(PredicatesProvider.class);
    谓词expectedPredicate=(u->true);
    when(mockPredicatesProvider.isUserValid()).thenReturn(expectedPredicate);
    when(mockObjectA).methodA(“someid”,expectedPredicate.),然后return(“something”);
    

  • 我想进一步考虑第一个解决方案,因为#3有点放松验证,不需要精确匹配。
    PredicatesProvider mockPredicatesProvider = mock(PredicatesProvider.class);
    Predicate<User> expectedPredicate = (u -> true);
    when(mockPredicatesProvider.isUserValid()).thenReturn(expectedPredicate);
    when(mockObjectA).methodA("some id", expectedPredicate).thenReturn("something");