簡體   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