mockito @Mock不按预期注入命名的@Resource

时间:2014-03-19 20:16:04

标签: java dependency-injection mockito

我有一个有三个名为@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(name = "contactsPaginationRequestValidator")
private PaginationRequestValidator mockPaginationRequestValidator;

这导致了类似但略有不同的结果。如上所述,第三个字段,而不是预期的目标字段被嘲笑,但它被模拟了@Mock中提供的名称。请参阅sysout:

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

这是完全出乎意料的行为。然而,还有更多。当我为第二个字段添加一个类似的模拟时,所有字段都按预期被模拟:

@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

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

我有解释此行为的文档,但它没有建议将相同的模拟注入所有三种模式的方法。这是可能的,还是我必须创建多个模拟然后更改单个测试用例以使用"更正"嘲笑?

测试套件使用@InjectMocks注释。

1 个答案:

答案 0 :(得分:5)

documentation of InjectMocks说:

  

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

所以你需要3个模拟,每个模拟都有要注入模拟的字段名称。