【发布时间】:2018-06-24 04:52:08
【问题描述】:
我正在使用EJB Project,使用JPA 到query data。现在,我创建unit test 并使用mockito 到mock data。有一个函数我从criteria builder 调用数据,它是从@PostConstruct 调用的。所以如果结果为空,那么它会抛出NoResultException。但是,我无法运行单元测试来测试它。看看下面的源代码:
对于类 RefdataUpdateDaoImpl
public class RefdataUpdateDaoImpl{
public RefdataUpdate getSingleUpdate() {
CriteriaBuilder cb = getCriteriaBuilder();
CriteriaQuery<RefdataUpdate> query = cb.createQuery(RefdataUpdate.class);
Root<RefdataUpdate> rootEntry = query.from(RefdataUpdate.class);
CriteriaQuery<RefdataUpdate> all = query.select(rootEntry);
TypedQuery<RefdataUpdate> allQuery = getEntityManager().createQuery(all);
return allQuery.getSingleResult();
}
}
在RefDataCacheBean
@PostConstruct
private void postConstruct() throws Exception{
cachedUpdateTs = RefdataUpdateDaoImpl.getLastUpdate();
}
这是单元测试
@Test(expected = NoResultException.class)
public void testExistingRefDataUpdate() throws NoResultException{
update.deleteRefDataUpdate();
refdataServiceBean.getLastUpdate();
}
所以在单元测试中,它从dataset xml 加载数据。所以当我运行测试时,它应该抛出NoResultException 并且测试通过,但是测试失败并且控制台日志没有找到实体数据。
在这种情况下,当函数从@PostConstruct 调用时,请帮助创建单元测试。
跟踪日志:
javax.ejb.EJBException: javax.persistence.NoResultException: No entity found for query
谢谢您,我们将不胜感激。
【问题讨论】:
-
你可以在日志中发布 sacktrace 吗?
-
嗨,Simon,帖子已编辑,请查看跟踪日志。谢谢。这意味着如果 allQuery 没有数据,那么 allQuery.getSingleResult();抛出异常
-
不确定这是否是实际问题,但这里不应该需要
throws NoResultException(因为它是 RuntimeException 的子类)。可能想尝试没有那个。 -
您已发布
getSingleUpdate的代码,但您的postConstruct使用getLastUpdate。那是错字吗?顺便说一句,你不应该在这里使用EntityManager.getSingleResult()。如果查询结果也包含多个结果,它将抛出异常。getSingleResult()应该只在查询被绑定返回单个结果时使用(例如SELECT MAX(...))。
标签: java unit-testing jpa mockito ejb