我正在为CatalogFacade类编写单元测试;这个类是这样的:
public class CatalogFacade{
@Inject
@Shallow //custom annotation
private ITServiceMapper servMapper;
@Inject
@Complete //custom annotation
private ITServiceMapper dServMapper;
@Override
public ITService getITService(String serviceCode) {
ITService a = dServMapper.method();
return a;
}
}
我以这种方式编写了单元测试:
@RunWith(MockitoJUnitRunner.class)
public class CatalogFacadeTest {
@InjectMocks
private CatalogFacade facade;
@Mock
private ITServiceMapper servMapperMock;
@Mock
private ITServiceMapper dServMapperMock;
@Test
public void getITService() {
/* prepare value objects */
ITService dtoMock= Mockito.mock(ITService.class);
/* Given some preconditions (Arrange) */
given(dServMapperMock.modelToDto(entityMock)).willReturn(dtoMock);
/* When an action occurs (Act) */
ITService service= facade.getITService("AMS-SA-0001");
/* Then verify the output (Assert) */
assertThat(dtoMock.getItServiceCode(),
is(equalTo(service.getItServiceCode())));
}
}
但是测试抛出了一个NullPointeException,因为当调用dServMapperMock.method()时,dservMapperMock是空的,所以我认为它没有被正确地模拟……
我认为问题可能是ITServiceMapper类有自定义注释,而我无法模拟它。
我怎么能模拟这个类呢?
谢谢!
发布于 2018-08-22 16:19:36
这不起作用的主要原因是因为您的类(CatalogFacade)中有多个ITServiceMapper
实例。
Mockito(特别是@InjectMocks)在这些场景中有一些问题。修复此问题的最简单方法是使用如下所示的name属性辅助Mockito
@Mock(name = "servMapper")
private ITServiceMapper servMapper;
@Mock(name = "dServMapper")
private ITServiceMapper dServMapperMock;
这就是构造函数注入总是比字段注入更好的原因之一。有关更多信息,请查看this文章
https://stackoverflow.com/questions/51962033
复制相似问题