gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:52:19 24 4
gpt4 key购买 nike

我正在尝试使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com