我有一个类,有三个命名的@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(name = "contactsPaginationRequestValidator")
private PaginationRequestValidator mockPaginationRequestValidator;
@Mock(name = "integerMaxPaginationRequestValidator")
private PaginationRequestValidator mockIntegerMaxPaginationRequestValidator;
系统输出:
paginationRequestValidator (contactsPaginationRequestValidator) is contactsPaginationRequestValidator
integerMaxPaginationRequestValidator (integerMaxPaginationRequestValidator) is integerMaxPaginationRequestValidator
contactsSearchResultPaginationRequestValidator (contactsSearchResultPaginationRequestValidator) is null
虽然这正是我所期望的,但它似乎与之前的尝试完全矛盾。
我有解释这种行为的文档,但它没有建议将相同的mock注入到所有三个mock中的方法。这是可能的吗?或者我必须创建多个模拟,然后更改单个测试用例以使用"正确的"模拟吗?
测试套件使用@InjectMocks注释
InjectMocks
的文档说:
字段注入;mock将首先按类型解析,然后,如果有几个相同类型的属性,则按字段名和mock名的匹配来解析。
所以您需要3个mock,每个mock都有要用mock注入的字段的名称。