【问题标题】:Unable to run Unit Test when call function in @PostConstruct在@PostConstruct 中调用函数时无法运行单元测试
【发布时间】:2018-06-24 04:52:08
【问题描述】:

我正在使用EJB Project,使用JPAquery data。现在,我创建unit test 并使用mockitomock 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


【解决方案1】:

显然 NoResultException 嵌套在 EJBException 中,因此您的测试代码应该是:

@Test(expected = EJBException.class)
public void testExistingRefDataUpdate() throws NoResultException{
    update.deleteRefDataUpdate();
    refdataServiceBean.getLastUpdate();
}

【讨论】:

    猜你喜欢
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多