繁体   English   中英

如何使用Mockito模拟带有自定义注释的类?

[英]How mock a class with a custom annotation using Mockito?

我正在为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为null,所以我认为它没有被正确模拟...

我认为问题可能出在ITServiceMapper类具有自定义批注的地方,我无法模拟它。

我如何嘲笑这堂课?

谢谢!

这不起作用的主要原因是,您的类(CatalogFacade)中有多个ITServiceMapper实例。

在这些情况下,Mockito(特别是@InjectMocks)存在一些问题。 解决此问题的最简单方法是通过协助Mockito像这样的name属性

@Mock(name = "servMapper")
private ITServiceMapper servMapper;

@Mock(name = "dServMapper")
private ITServiceMapper dServMapperMock;

这是构造函数注入总是比字段注入更好的原因之一。 检查文章了解更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM