2015-06-29 3 views
3

У меня есть два класса:модульного тестирования Java издеваться метод с предикатом в качестве аргумента

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$5/[email protected]> but was:<PredicatesProvider$$Lambda$5/[email protected]> 

Это своего рода упрощенная версия того, чего я пытаюсь достичь. Я думаю, это проблема с функцией equals() предиката. Любая идея, как издеваться над методом, который имеет предикат?

Благодаря

ответ

6

я вижу 4 возможных решения:

  1. всегда возвращают один и тот же экземпляр предиката из метода isUserValid(). Поскольку предикат не имеет гражданства, это не проблема.

  2. Реализовать предикат как настоящий класс, реализующий equals() и hashCode(). Но это слишком много по сравнению с первым решением.

  3. Используйте Сличитель:

    Mockito.when(mockObjectA).methodA(Mockito.eq("some id"), Mockito.<Predicate<User>>anyObject()).thenReturn("something"); 
    
  4. Не использовать статический метод, чтобы создать предикат, но инъекционный завод, который вы можете издеваться и проверить:

    PredicatesProvider mockPredicatesProvider = mock(PredicatesProvider.class); 
    Predicate<User> expectedPredicate = (u -> true); 
    when(mockPredicatesProvider.isUserValid()).thenReturn(expectedPredicate); 
    when(mockObjectA).methodA("some id", expectedPredicate).thenReturn("something"); 
    
+0

Я хочу продолжить первое решение, потому что # 3 отменит проверку и не требует точного соответствия. – beijxu

Смежные вопросы