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

mockito@mock未按预期注入命名的@resource

周良弼
2023-03-14

我有一个包含三个命名的@resource成员的类,如下所示:

@Resource(name = "contactsPaginationRequestValidator")
private PaginationRequestValidator paginationRequestValidator;

@Resource(name = "integerMaxPaginationRequestValidator")
private PaginationRequestValidator integerMaxPaginationRequestValidator;

@Resource(name = "contactsSearchResultPaginationRequestValidator")
private PaginationRequestValidator contactsSearchResultPaginationRequestValidator;

从1.8.5升级到Mockito 1.9.5后,测试开始失败。测试套件仅模拟了一次PaginationRequestValidator,如下所示:

@Mock
private PaginationRequestValidator mockPaginationRequestValidator;

这导致只有三个实例中的第三个被注入,如下sysout所示:

paginationRequestValidator (contactsPaginationRequestValidator) is null
integerMaxPaginationRequestValidator (integerMaxPaginationRequestValidator) is null
contactsSearchResultPaginationRequestValidator (contactsSearchResultPaginationRequestValidator) is mockPaginationRequestValidator

显然,两个版本之间的行为发生了变化。我假设旧版本将mock注入到所有三个字段中--这对我来说仍然是一个可以接受的解决方案。

作为一个聪明人,我想我可以通过提供与资源相关联的名称来通过测试,如下所示:

@Mock(name = "contactsPaginationRequestValidator")
private PaginationRequestValidator mockPaginationRequestValidator;

这导致了相似但微妙不同的结果。第三个字段(不是预期的目标字段)被嘲弄,如上所示,而是使用@mock中提供的名称来嘲弄它。参见SYSOUT:

paginationRequestValidator (contactsPaginationRequestValidator) is null
integerMaxPaginationRequestValidator (integerMaxPaginationRequestValidator) is null
contactsSearchResultPaginationRequestValidator (contactsSearchResultPaginationRequestValidator) is contactsPaginationRequestValidator

这完全是意料之外的行为。然而,还有更多。当我为第二个字段添加类似的mock时,所有字段都以预期的方式结束:

@Mock(name = "contactsPaginationRequestValidator")
private PaginationRequestValidator mockPaginationRequestValidator;

@Mock(name = "integerMaxPaginationRequestValidator")
private PaginationRequestValidator mockIntegerMaxPaginationRequestValidator;

SYSOUT:

paginationRequestValidator (contactsPaginationRequestValidator) is contactsPaginationRequestValidator
integerMaxPaginationRequestValidator (integerMaxPaginationRequestValidator) is integerMaxPaginationRequestValidator
contactsSearchResultPaginationRequestValidator (contactsSearchResultPaginationRequestValidator) is null

虽然这与我所期望的完全一样,但它似乎与之前的尝试完全矛盾。

我有解释这种行为的文档,但它没有建议将相同的mock注入到所有三个中。这是可能的,还是我必须创建多个模拟,然后更改单个测试用例以使用“正确的”模拟?

测试套件使用@InjectMocks注释。

共有1个答案

扈翰
2023-03-14

injectmocks的文档说明:

现场注入;模拟将首先按类型解析,然后,如果有几个相同类型的属性,则按字段名和模拟名的匹配进行解析。

因此,您需要3个模拟,每个都有要与模拟一起注入的字段的名称。

 类似资料:
  • 我想模拟Date对象的构造函数。但它并没有像我预期的那样工作<假如我有这样的服务。 我写了下面的测试 结果是: 组织。opentest4j。断言失败错误: 预计时间:2020年2月1日星期六00:00:00 CST实际时间:2022年5月9日星期一18:35:05 CST mock之后,服务将返回mockDate对象。但事实并非如此。有趣的是,如果我在测试中而不是在服务中调用新日期,我会得到正确的

  • 我正在为一个具有2级依赖注入的类编写一个测试用例。我对1级依赖项注入对象使用@Spy注释,我想模拟第2级注入。但是,我在第二级上不断遇到空指针异常。有没有办法将模拟注入@Spy对象?

  • 我正在使用JUnit和Mockito库来测试我的应用程序。问题是,当我在代码下面执行时,值在运行时没有返回空列表,并且测试失败。理想情况下,当get执行时,它应该返回空列表 我热切期待着支持。有没有人能帮我一下,如何通过这个测试用例???。如何通过Mockito使第8行的控件通过测试用例??? 请假设,下面两个类没有真实的代码,我们只有二进制文件作为JAR文件,我们不能修改下面的代码....我附上

  • 我有一个jsf spring应用程序,并使用mockito进行单元测试。在模拟中运行测试时,我一直得到。对于不存在。 要嘲弄的方法 我的JUnit测试是用注释的

  • 我正在使用请求有效负载中的对象数组调用API,我在@Request estBody中添加了@有效注释以检查是否有任何空属性在我的有效负载中发送。我希望我正在发送的任何空数据都应该抛出错误。但我的代码没有抛出错误 下面是我的实体课 这是我的控制器类 验证依赖项 我的请求有效负载 当我发送上述有效负载时,我希望抛出一个错误,因为我没有发送不为null的性别,但spring没有抛出任何错误。 我是否错过

  • 我试图用Mockito mock对象替换对象。通常的方法是使用Springockito使用xml: 目前,我正在尝试使用Spring的JavaConfig来完成这项工作。突然之间,Java表达式比xml要详细得多: 我发现了一个名为Springockito annotations的库,它允许您执行以下操作: 显然,更漂亮:)唯一的问题是,这个上下文加载器不允许我对其他bean使用和JavaConf