我有一个有三个名为@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注释。
答案 0 :(得分:5)
documentation of InjectMocks
说:
现场注入; mocks将首先按类型解析,然后,如果有多个相同类型的属性,则通过匹配字段名称和模拟名称。
所以你需要3个模拟,每个模拟都有要注入模拟的字段名称。