- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 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/
我正在尝试使用 mockito 根据列表元素的类型返回不同的结果。 假设我想要以下服务方法的不同结果: public class MyService { MyBean createBean(Li
我是一名优秀的程序员,十分优秀!