Макет объекта 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?

Другие вопросы по тегам