![](/img/trans.png)
[英]I am getting “Exception in thread ”main" java.lang.NullPointerException even though no values are set to 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);
當您使用 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.