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

Bil*_*ner 6 java dependency-injection mockito

我有一个有三个名为@Resource成员的类,如下所示:

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

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

@Resource(name = "contactsSearchResultPaginationRequestValidator")
private PaginationRequestValidator contactsSearchResultPaginationRequestValidator;
Run Code Online (Sandbox Code Playgroud)

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

@Mock
private PaginationRequestValidator mockPaginationRequestValidator;
Run Code Online (Sandbox Code Playgroud)

这导致三个实例中只有三个被注入,因为以下sysout明确说明:

paginationRequestValidator (contactsPaginationRequestValidator) is null
integerMaxPaginationRequestValidator (integerMaxPaginationRequestValidator) is null
contactsSearchResultPaginationRequestValidator (contactsSearchResultPaginationRequestValidator) is mockPaginationRequestValidator
Run Code Online (Sandbox Code Playgroud)

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

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

@Mock(name = "contactsPaginationRequestValidator")
private PaginationRequestValidator mockPaginationRequestValidator;
Run Code Online (Sandbox Code Playgroud)

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

paginationRequestValidator (contactsPaginationRequestValidator) is null
integerMaxPaginationRequestValidator (integerMaxPaginationRequestValidator) is null
contactsSearchResultPaginationRequestValidator (contactsSearchResultPaginationRequestValidator) is contactsPaginationRequestValidator
Run Code Online (Sandbox Code Playgroud)

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

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

@Mock(name = "integerMaxPaginationRequestValidator")
private PaginationRequestValidator mockIntegerMaxPaginationRequestValidator;
Run Code Online (Sandbox Code Playgroud)

SYSOUT:

paginationRequestValidator (contactsPaginationRequestValidator) is contactsPaginationRequestValidator
integerMaxPaginationRequestValidator (integerMaxPaginationRequestValidator) is integerMaxPaginationRequestValidator
contactsSearchResultPaginationRequestValidator (contactsSearchResultPaginationRequestValidator) is null
Run Code Online (Sandbox Code Playgroud)

虽然这正如我所期望的那样,但它似乎与之前的尝试完全矛盾.

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

测试套件使用@InjectMocks注释.

JB *_*zet 6

文件InjectMocks说:

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

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

  • @BillTurner不,它不是自1.9.0以来.1.8.5中的行为是一个错误.这几乎解释了为什么javadoc没有改变;) (2认同)