在@PostConstruct中调用函数时无法运行单元测试

时间:2018-01-15 14:28:37

标签: java unit-testing jpa mockito ejb

我正在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

谢谢,任何意见将不胜感激。

1 个答案:

答案 0 :(得分:0)

显然NoResultException嵌套在EJBException中,所以你的测试代码应该是:

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