【发布时间】:2021-11-29 09:20:53
【问题描述】:
@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()”没有被调用
【问题讨论】:
标签: java hibernate jpa mockito criteria