Макет объекта Mockito со списком содержимого аргумента
Я сталкивался с этой ситуацией довольно часто и не знаю, как ее решить, используя стандартные методы Mockito, такие как (any, anyList, eq)
Например, у меня есть объект, где я хочу смоделировать метод, ожидающий список, который содержит другие смоделированные объекты. Позволь мне объяснить:
public class MyMapper {
public List<DataObjects> convertList(List<String> rawContents) {
rawContents.stream().map(r -> convertObject(r))
.collect(Collectors.toList());
}
public DataObject convertObject(String rawContent) {
return new DataObject(rawContent);
}
}
public class MyWorkerClass {
public boolean start(List<String> rawContents) {
List<DataObject> objects = new MyMapper().convertList(rawContents);
return publish(objects);
}
public boolean result publish(List<DataObject> objects) {
../// some logic
}
}
Теперь, что я хочу утверждать, что-то вроде. Примечание: Пожалуйста, примите во внимание, что правильные макеты возвращаются при вызове new() [Использование некоторых PowerMockito]
@Test
public void test() {
String content = "content";
DataObject mock1 = Mockito.mock(DataObject.class);
MyMapper mapperMock = Mockito.mock(MyMapper.class);
MyWorkerClass worker = new MyWorkerClass();
Mockito.when(mapperMock.convertObject(content)).thenReturn(mock1);
Mockito.when(worker.publish(eq(Arrays.asList(mock1)).thenReturn(true);
boolean result = worker.start(Arrays.asList(content));
Assert.assertTrue(result);
}
Проблема с кодом выше в строке
Mockito.when(worker.publish(eq(Arrays.asList(mock1)).thenReturn(true);
Это попытается сопоставить объект списка, а не содержимое списка, другими словами, даже когда мне нужно перечислить списки A: [mock1] и B: [mock1], A не равно B, и в конечном итоге заглушка завершится неудачно.
То, что мне нужно, это какой-то матчер, похожий на Хэмкрест contain
согласовани. Что-то вроде:
Mockito.when(worker.publish(contains(mock1)).thenReturn(true));
Могу ли я в любом случае добиться этого? Помните, что приведенный выше код является лишь примером для понимания проблемы, реальная ситуация немного сложнее, и я могу только высмеивать отдельные объекты, а не сам список
Спасибо
1 ответ
Не важно, позже я узнал, что метод Moqito eq() будет вызывать метод equals() для аргумента. Теперь, если это ArrayList, это означает, что он вернет true, если два размера списка равны и если сравнение равных для каждого из элементов в списке также возвращает true. См. https://docs.oracle.com/javase/6/docs/api/java/util/List.html.
А для еще большей настройки можно использовать argThat(). В чем разница между Mockito Matchers isA, any, eq и same?