当前位置: 首页 > 知识库问答 >
问题:

在一个类中嘲弄两张地图

孙永思
2023-03-14

我必须测试一个用Spring注入两个映射的类。我想模拟两张地图。我使用模拟符号如下:

@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

共有1个答案

司空高义
2023-03-14

只要两个字段的类型相同,mockito就不知道如何按类型注入模拟。所以它试着按名字注入。在这种情况下,被测试类中字段的名称似乎与您创建的mock对象不匹配。以下是@injectmocks的文档:

现场注入;模拟将首先按类型解析(如果一个类型匹配注入将发生而不考虑名称),然后,如果有几个相同类型的属性,则按字段名和模拟名的匹配解析。

您可以重命名文件或使用显式模拟名称:

@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;

文件中提到:

构造函数注入;选择最大的构造函数,然后使用仅在测试中声明的模拟来解析参数

 类似资料:
  • 我需要测试一些遗留代码,这些代码在a方法调用中使用了单例。测试的目的是确保类sunder测试对singletons方法进行调用。我在SO上看到过类似的问题,但所有的答案都需要其他依赖项(不同的测试框架)--不幸的是,我仅限于使用Mockito和JUnit,但对于这样流行的框架,这应该是完全可能的。 单身人士: 正在测试的类: 单元测试: 这个想法是配置可怕的单例的预期行为,因为被测试的类将调用它的

  • 在helper类的静态方法中调用时,它会抛出一个NPE。我所做的是嘲笑MarkupMaker和它的返回值(一个Markup实例)。最后,我希望调用标记实例的。无论我做什么-的调用都是抛出一个NPE。我找不到任何文档告诉我如何在spock中详细模拟方法调用值。 编辑:我添加了示例。的调用返回null,即使我在spock测试中对其进行了嘲弄。 test.groovy java(执行模拟对象的方法) j

  • 正在测试的类: 下面是测试代码。我模拟了测试中的类class,并覆盖了方法getFruits的返回值。但是当我运行mock时,我没有得到预期的mock返回值。Easymock可以将返回值替换为被测试类的方法,如果这些方法是显式模拟的。当我模拟真实的对象方法时,如何获得模拟的返回值。

  • 任何帮助都将得到高度赞赏。 提前致谢

  • 我正在为类编写一个单元测试,该类如下所示: 我想编写一个简单的单元测试,它将方法存根(这样它就不会实际触发并命中数据库),但它允许我验证调用是否最终执行。Mockito似乎是这份工作的合适工具。 这似乎是一个很好的游戏计划(至少对我来说)。但当我实际编写代码时,在测试方法的第2行(行)出现以下编译器错误: 类型Mockito中的(T)不适用于参数(void)时的方法 我看到Mockito无法模拟返

  • 最近,我看到一篇博文说,“出于文档的目的,我们在服务层使用mocking(在使用spring rest doc的环境中)”,所以这篇博文使用了类似spring的@MockBean到服务层对象的注释。 但我认为,如果我模仿服务层- 所以我觉得这是不对的但是, 我想知道什么更好,或者如何将service object与spring rest文档一起使用 恳求回答