java - Mockito anyListOf : results being overridden with different instances as parameters

标签 java mockito

我正在尝试使用 mockito 根据列表元素的类型返回不同的结果。

假设我想要以下服务方法的不同结果:

public class MyService {
   MyBean createBean(List<? extends A>, Report report) {
       //some super code
   } 
}

public interface A {

}

public class B implements A {

}

public class C implements A {

}

public Report {
    public List<B> bList;
    public List<C> cList;

    //getters and setters
}

createBean(..) 方法在一个正在测试的类上,我想确保在调用时使用正确的列表调用它。所以我创建了以下模拟结果:

doReturn(createBean01()).when(myService).createBean(anyListOf(B.class), any(Report.class));
doReturn(createBean02()).when(myService).createBean(anyListOf(C.class), any(Report.class));

我原以为当使用具有类型 B 的元素的列表调用 createBean 方法时返回 Bean01,而当使用具有类型 C 的元素的列表调用时返回 Bean02。

我也尝试了列表的特定实例,但行为是相同的。

doReturn(createBean01()).when(myService).createBean(report.getBList(),report);
doReturn(createBean02()).when(myService).createBean(report.getCList(),report);

看起来行为被覆盖了。就像 Mockito 不区分子类型。

我缺什么?如何根据列表的类型获得不同的结果类型?

非常感谢。

最佳答案

你搞错了。您使用模拟规范来表达/配置特定测试的特定设置。

我的意思是:除了泛型在运行时被删除并且您(通常)不知道创建列表时使用的特定泛型类型之外 - 您真的不希望你的测试代码基于给模拟对象的参数做一些事情。

换句话说:尽可能具体地写下您的测试,例如:

@Test
public void testWithA() {
  when(myService.createBean(someListOfBs)).thenReturn(someResultA);
  ...
}

@Test
public void testWithB() {
  when(myService.createBean(someListOfBs)).thenReturn(somethingElse);
  ...
}

含义:像那样使用模拟规范——作为告诉模拟框架它应该如何表现的规范。避免陷入围绕这些规范的复杂逻辑业务!

并且提示:你应该更喜欢 when().then() 而不是 doAnswer().when()。 You only use the later one for those rare cases when the more strict type checking that option 1 gives ... doesn't work for your test scenario.

关于java - Mockito anyListOf : results being overridden with different instances as parameters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46056169/

相关文章:

java - 从页面名称中删除 .jsp

java - Mahout 朴素贝叶斯 CSV 分类

java - 计算间接方法调用 Mockito

java - 我怎样才能 mock 这个论点匹配器?

尝试在服务器上上传文件时出现 java.lang.IndexOutOfBoundsException

java - 未排序数组中的二进制搜索

java - 在 openshift 中连接 mongodb 显示错误。

java - Mockito 为了验证任何匹配器

testing - 如何 Junit 测试具有特定响应的 servlet 过滤器

java - 有没有办法提取方法中使用的实例和静态变量,以了解需要模拟哪些对象