我试图根据列表元素的类型返回不同的结果。
可以说,我想要以下服务方法不同的结果:
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));
我期望在createBean方法中返回bean01,并带有带有类型B元素的列表的列表,而Bean02墨水墨水,并用c。
的元素进行墨我也尝试了列表的特定实例,但行为是相同的。
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);
...
}
含义:使用模拟规范作为一种说明模拟框架的规格。避免从这些规格围绕这些规格具有复杂性逻辑的业务!
和提示:您应该更喜欢()。当选项1给出的更严格的 type检查时,您仅对以后的情况使用。