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

标签 java maps mockito

我必须测试一个用 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/

相关文章:

c# - 当 Windows Phone 8 map 控件开始和停止滚动时会触发什么事件?

kotlin - 如何模拟 Kotlin List.forEach?

java - 从 Swing 按钮 ActionPerformed 访问 DatagramSocket 对象

java - 在重定向的错误页面上返回到默认的 Tomcat 错误页面

android - 在 Android 上获取给定边界的 map 缩放级别,就像在 JS Google Maps API 上一样 : map. getBoundsZoomLevel(bounds)

java - Java中使用Mockito模拟MongoDB的DeleteResult

java - 如何在mockito中模拟 map ?

java - Magnolia CMS - 自定义 SelectFieldDefinition - 页面上所有可用的组件

java - 无法从 KeyStore 获取 key

Android Mapv2 问题