2015-09-02 63 views
1
我有我的查詢對象的問題

,就變成零,即使我存根其與查詢模擬對象.. 這是代碼NullPointerException異常的Mockito對原生查詢

Query query = getEntityManager().createNativeQuery(queryString, SomeRandom.class); 

return query.getResultList(); //-->This is where I get the error, the query object is null. 

我的測試方法是

Query query = mock(Query.class); 
when(entityManager.createNativeQuery("", SomeRandom.class)).thenReturn(query); 
List<SomeRandom> someList = requestDao.getSomeList(parameter, parameter, parameter, parameter); 
+0

您是否在模仿_createNativeQuery_函數時嘗試使用_anyString()_而不是空字符串(「」)? – mbm

+0

是的,我已經做了,但我已經解決了這個問題。謝謝btw。 – Aaron

回答

1

這可能意味着您傳遞給模擬方法的匹配器之一不匹配。您將實際的String實例(空字符串)傳遞給Equals matcher。你的例子只有在queryString也是空字符串的情況下才有效。

這應該與任何查詢字符串:

when(entityManager.createNativeQuery(anyString(), eq(SomeRandom.class))) 
    .thenReturn(query); 

這在您希望傳遞一些具體的字符串:

String expectedQueryString = "select 1"; 

when(entityManager.createNativeQuery(expectedQueryString, SomeRandom.class)) 
    .thenReturn(query); 

編輯基於評論:

如果從eq(SomeRandom.class)改爲any()解決了這個問題,那麼eq(SomeRandom.class)匹配器不匹配,這意味着SomeRandom.class不是事實上傳遞給嘲笑的方法。

+0

它沒有爲我工作,我發佈這個問題之前已經做了這件事。我從這個https://github.com/spring-projects/spring-data-jpa/blob/master/src/test/java/org/springframework/data/jpa/repository/query/SimpleJpaQueryUnitTests.java得到了答案。 – Aaron

1

我能夠使用此代碼做到這一點,我用 This作爲我的參考。

Class<?> type = Mockito.any(); 
when(entityManager.createNativeQuery(Mockito.anyString(), type)).thenReturn(query); 
+0

**永遠不要將Mockito匹配器提取到局部變量。** [匹配器通過副作用工作](http://stackoverflow.com/q/22822512/1426891),並且像你在這裏一樣抽取使它們錯位。此代碼現在可用(因爲'any'不檢查有關該參數的任何內容),但如果將匹配器更改爲'eq'或其他任何內容,這將以難以診斷的方式中斷。 –

+0

謝謝,我要檢查一下。 – Aaron