Java 具有列表参数的Mockito mock对象';内容

Java 具有列表参数的Mockito mock对象';内容,java,junit,mockito,powermockito,hamcrest,Java,Junit,Mockito,Powermockito,Hamcrest,我经常遇到这种情况,不知道如何使用Mockito的默认方法(any、anyList、eq)来解决它 例如,我有一个对象,我想模拟一个方法,该方法需要一个包含其他模拟对象的列表。让我解释一下: public class MyMapper { public List<DataObjects> convertList(List<String> rawContents) { rawContents.stream().map(r -> convertObje

我经常遇到这种情况,不知道如何使用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
     }
}
上面代码的问题就在这一行

  Mockito.when(worker.publish(eq(Arrays.asList(mock1)).thenReturn(true);
这将尝试匹配列表对象而不是列表内容,换句话说,即使我必须列出A:[mock1]和B:[mock1],A也不等于B,最终存根失败

我需要的是某种类似于hamcrest的
contain
matcher的匹配器。比如:

  Mockito.when(worker.publish(contains(mock1)).thenReturn(true));
我有没有办法做到这一点?请记住,上面的代码只是一个理解问题的示例,实际情况有点复杂,我只能模拟单个对象,而不能模拟列表本身


谢谢

不用担心,后来我了解到Mockito的eq()方法将对参数调用equals()方法。现在,如果这是一个ArrayList,它意味着如果两个列表大小相等,那么它将返回true,如果相等的列表中每个元素的比较也返回true。看


对于更多的定制,可以使用argThat()

不,这不是问题所在。问题是MyWorkerClass创建了自己的MyMapper实例,而n使用它。它不使用测试创建的模拟MyMapper。代码也不会编译。您试图模拟一个真实对象(worker)的方法。发布一个真实的编译示例,它实际上再现了这个问题。正如我所说的,代码只是一个参考。您可以假设有一些额外的PowerMockito stubing正在进行,以便在新的MyWorkerClass()上返回正确的mock。问题是,如果我需要在您的一半代码行上假设一些不同的东西,那么很难猜测实际的问题是什么。所以,再一次,发布一个真实的编译示例,它实际上再现了这个问题。
  Mockito.when(worker.publish(contains(mock1)).thenReturn(true));