Mockito Anylistof:结果被不同的实例作为参数所覆盖



我试图根据列表元素的类型返回不同的结果。

可以说,我想要以下服务方法不同的结果:

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检查时,您仅对以后的情况使用。

相关内容

  • 没有找到相关文章

最新更新