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注释.
现场注入; mocks将首先按类型解析,然后,如果有多个相同类型的属性,则通过匹配字段名称和模拟名称.
所以你需要3个模拟,每个模拟都有要注入模拟的字段名称.