Hamcrest hasItem и Mockito проверяют несоответствие

У меня возникла проблема с hamcrest и mockito. Вот что я пытаюсь сделать:

public class A{
     public void foo(List<B> arg){
          return;
     }
}

public BMatcher extends BaseMatcher<B>{
 //Some impl...
}

В моем тесте я хочу сделать что-то вроде

A a = mock(A.class);
B expected = new B();
Mockito.verify(a).foo(argThat(JUnitMatchers.hasItem(new BMatcher(expected)));

Однако сопоставитель hasItem возвращает Iterable<B>, а метод foo ожидает List<B>. Есть ли хороший способ проверить правильность вызова метода?


person Alex Zhicharevich    schedule 18.06.2013    source источник


Ответы (2)


Вы можете использовать ArgumentCaptor.

 @Captor
 ArgumentCaptor<List<B>> captor;

 // then in test
 ...
 verify(a).foo(captor.capture());
 List<B> values = captor.getValue();
 assertThat(values, IsIterableContainingInOrder.containingInOrder(new BMatcher(expected));
 ...

Я использовал @Captor в качестве ярлыка, а также для того, чтобы это могло быть List<B> вместо просто List. Это требует использования MockitoAnnotations.init(this) в методе @Before.

person John B    schedule 18.06.2013

Вы можете использовать метод 'argThat' в классе Mockito Matchers для преобразования из hamcrest Matcher в сопоставитель аргументов mockito:

import static org.mockito.Matchers.argThat;
import org.hamcrest.Matchers;
import org.hamcrest.Matcher;
//....
public static <T> List<T> listWithItem(Matcher<T> m)
{
    return (List<T>)argThat(Matchers.hasItem(m));
}
person Andy    schedule 23.05.2016