@Transactional
public List<Object[]> findAll() {
Session session = sessionFactory.getCurrentSession();
CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
CriteriaQuery<Object[]> query = criteriaBuilder.createQuery(Object[].class);
Root<TableA> aRoot = query.from(TableA.class);
Root<TableB> bRoot = query.from(TableB.class);
Root<TableC> cRoot = query.from(TableC.class);
query.multiselect(aRoot.get("type"), cRoot.get("fieldId"), aRoot.get("fieldId"),
aRoot.get("fieldId"), aRoot.get("name"), aRoot.get("name"),
aRoot.get("average"), aRoot.get("average"));
query.where(criteriaBuilder.equal(bRoot.get("fieldId"), cRoot.get("fieldId")),
criteriaBuilder.in(bRoot.<String>get("type")).value("ABC").value("DFG"),<-----NullPointerException Here
criteriaBuilder.equal(bRoot.get("type"), aRoot.get("type")));
query.distinct(true);
return session.createQuery(query).getResultList();
}
這種方法已經過審查,但效果很好。我的問題是完成單元測驗以覆寫代碼,以便我可以推送到我們的存盤庫。
@Before
@Override
public void setup() {
super.setup();
}
@InjectMocks
@Spy
Dao dao;
@Mock
SessionFactory sessionFactory;
@Mock
Session mockSession;
@Mock
CriteriaBuilder criteriaBuilder;
@Mock
CriteriaQuery<Object> query;
@Mock
Root<TableA> mockARoot;
@Mock
Root<TableB> mockBRoot;
@Mock
Root<TableC> mockCRoot;
@Mock
Query<Object> result;
@Test
public void findAll() {
Mockito.when(sessionFactory.getCurrentSession()).thenReturn(mockSession);
Mockito.when(mockSession.getCriteriaBuilder()).thenReturn(criteriaBuilder);
Mockito.when(criteriaBuilder.createQuery(Mockito.anyObject())).thenReturn(query);
Mockito.when(query.from(TableA.class)).thenReturn(mockARoot);
Mockito.when(query.from(TableB.class)).thenReturn(mockBRoot);
Mockito.when(query.from(TableC.class)).thenReturn(mockCRoot);
Mockito.when(mockSession.createQuery(query)).thenReturn(result);
dao.findAll();
}
我相信 In 子句需要一個運算式或謂詞。我是否需要模擬并傳入其他介面才能使其作業?我真的很想將這種查詢構造風格添加到我們的代碼庫中,但我無法完成 junit 測驗。任何幫助將不勝感激!
當我除錯時,它說尚未呼叫方法“Where()”
uj5u.com熱心網友回復:
您還沒有模擬所有方法呼叫... query.multiselect, aRoot.get("fieldId")...模擬背后的原則是您有責任模擬所有需要的方法呼叫并定義您想要的結果。
uj5u.com熱心網友回復:
據我所知,人們不會使用mockito來測驗Dao層。它應該作為集成測驗進行測驗。
關于mockito,我們應該只模擬在方法中使用其他類的物件的層,例如在您的代碼中,變數sessionFactory是Dao中findAll方法中使用的其他類的物件。
我們應該在方法(區域變數)中模擬那個類,而不是初始化它的變數。
PS:完整的錯誤堆疊跟蹤將更有助于解決此問題。
uj5u.com熱心網友回復:
@Test
public void findAll() {
when(sessionFactory.getCurrentSession()).thenReturn(mockSession);
when(mockSession.createQuery(anyString())).thenReturn(mockQuery);
when(mockSession.getCriteriaBuilder()).thenReturn(criteriaBuilder);
when(criteriaBuilder.createQuery(Mockito.anyObject())).thenReturn(query);
when(query.from(TableA.class)).thenReturn(mockARoot);
when(query.from(TableB.class)).thenReturn(mockBRoot);
when(query.from(TableC.class)).thenReturn(mockCRoot);
when(mockAreaRoot.get(anyString())).thenReturn(path);
when(criteriaBuilder.in(path)).thenReturn(in);
when(in.value(anyString())).thenReturn(in);
when(mockSession.createQuery(query)).thenReturn(setQuery);
dao.findAll();
verify(dao, times(1)).findAll();
}
不是很實用,但它可以完成作業。謝謝大家的建議。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/312646.html
上一篇:顯式模板實體化示例
