gpt4 book ai didi

java - 在一个类中模拟两个 map

转载 作者:行者123 更新时间:2023-11-30 10:23:14 26 4
gpt4 key购买 nike

我必须测试一个用 Spring 注入(inject)两个 map 的类。我想模拟这两张 map 。我使用模拟符号如下:

@Mock
private Map<String, Integer> map1;

@Mock
private Map<String, Date> map2;

但我收到以下错误:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.util.Date

两个 map 似乎都只使用了第一个模拟 map 。

我做错了什么?

最佳答案

只要两个字段的类型相同,mockito 就不知道如何按类型注入(inject)您的 mock。所以它尝试按名称注入(inject)它。在这种情况下,看起来您的被测类中的字段名称与您创建的模拟对象不匹配。这是 doc对于@InjectMocks:

Field injection; mocks will first be resolved by type (if a single type match injection will happen regardless of the name), then, if there is several property of the same type, by the match of the field name and the mock name.

您可以重命名您的文件或使用明确的模拟名称:

@Mock(name="foo")
private Map<String, Integer> map1;

@Mock(name="bar")
private Map<String, Date> map2;

但我认为这不是最好的解决方案。如果文件名将被重命名,您将得到假阴性测试结果:功能正常但测试失败。

对我来说,最好的解决方案是重构您的代码,以便被测类在构造函数中接收依赖项。之后你可以像这样模拟它:

@Mock
private Map<String, Integer> map1;

@Mock
private Map<String, Date> map2;

private ClassUnderTets cut;

@Before
public void setUp() throws Exception {
cut = new ClassUnderTets(map1, map2);
}

甚至:

@Mock
private Map<String, Integer> map1;

@Mock
private Map<String, Date> map2;

@InjectMocks
private ClassUnderTets cut;

如文档中所述:

Constructor injection; the biggest constructor is chosen, then arguments are resolved with mocks declared in the test only

关于java - 在一个类中模拟两个 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47155858/

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