簡體   English   中英

獲取 nullPointerException 因為 Mockito 變量設置為 null 即使我已經模擬了它

[英]Getting nullPointerException because Mockito variable is set to null even though I have mocked it

這是我要進行單元測試的類和方法。

public abstract class ShowService {

    @Resource(name = "blogCoreSolrClient")
    private SolrClient blogCoreSolrClient;


    protected Show findShow(ClientRegion clientRegion, TargetLocale locale, Integer showId) {

        SolrQuery query = new SolrQuery();
        query.setQuery("type:" + SolrType.show)
                .addFilterQuery(getRegionQuery(clientRegion))
                .addFilterQuery(getLanguageFallbackQuery(locale))
                .addFilterQuery("show_id:" + showId)
                .setRows(1);

        QueryResponse response = blogCoreSolrClient.query(query);

        List<Show> shows = response.getBeans(Show.class);

        if (shows != null && shows.size() > 0) {
            return shows.get(0);
        }

        return null;

    }

    public static class SyndicatedShow {
        @Field("show_id")
        public Integer showId;

        @Field("path_value")
        public String pathValue;
    }
}

這是我使用 Mockito 編寫的單元測試

public class ShowServiceTest {

    public final QueryResponse queryResponse = Mockito.mock(QueryResponse.class);
    public final SolrClient blogCoreSolrClient = Mockito.mock(SolrClient.class);
    public final SolrQuery SolrQuery = Mockito.mock(SolrQuery.class);
    private SolrDocumentList solrDocuments = Mockito.mock(SolrDocumentList.class);
    private ShowService showService = Mockito.mock(ShowService.class);


    @Test
    public void findShowTest() {
      Mockito.when(blogCoreSolrClient.query(solrQueryCaptor.capture())).thenReturn(queryResponse);
        
       

        Mockito.when(queryResponse.getResults()).thenReturn(solrDocuments);


       Mockito.when(blogCoreSolrClient.query(any())).thenReturn(queryResponse);

        ShowService.Show showsResult = ShowService.findShow(ClientRegion.US, TargetLocale.EN_US, 1234);

        assertThat(showsResult.pathValue).isEqualTo("shows/test/");
    }


}

當代碼傳遞給 findShow() 時,我在blogCoreSolrClient處得到 Null。 因此,我得到了 NullPointerException。 任何建議,我可能會出錯。 TIA

有不同的問題:

  • 你在嘲笑被測類
 private ShowService showService = Mockito.mock(ShowService.class);
  • 您不告訴 ShowService 使用 blogCoreSolrClient 模擬,然后創建 blogCoreSolrClient 模擬實例,但從未使用過。

當您使用 IOC 注入 SolrClient(@Resource 注釋)時,您需要在測試期間將模擬注入 ShowService 實例。 有不同的解決方案,但在您的情況下更方便的是使用 Mockito 擴展來執行注入。 就像是 :

@ExtendWith(MockitoExtension.class)
public class ShowServiceTest {

@Mock
private SolrClient blogCoreSolrClient;
... // Other mocks

@InjectMocks
private ShowService showService;

@Test
public void findShowTest() {
  Mockito.when(blogCoreSolrClient.query(any())).thenReturn(queryResponse);
  ... // Complete test

}

}

問題是您的測試類是一個抽象類。 我沒有看到任何抽象方法。 所以,如果你真的需要被測試的類是抽象的,那么你將面臨@InjectMocks 的技術難題。 以下是一些解決方案: https ://tedvinke.wordpress.com/2020/06/22/mockito-cannot-instantiate-injectmocks-field-the-type-is-an-abstract-class/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM