【问题标题】:How mock a class with a custom annotation using Mockito?如何使用 Mockito 模拟具有自定义注释的类?
【发布时间】:2018-08-22 07:44:02
【问题描述】:

我正在为 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 类具有自定义注释,我无法模拟它。

如何模拟这个类?

谢谢!

【问题讨论】:

    标签: java unit-testing annotations mockito


    【解决方案1】:

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

    Mockito(特别是 @InjectMocks)在这些场景中存在一些问题。解决这个问题的最简单方法是通过像这样的 name 属性帮助 Mockito

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

    这也是构造函数注入总是优于字段注入的原因之一。 查看this文章了解更多信息

    【讨论】:

      猜你喜欢
      • 2013-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多