JBOSS Arquillian:如何在运行aquillian测试时强制数据库抛出异常?

时间:2016-06-14 14:26:22

标签: jpa jboss ejb jboss-arquillian versant-vod

我正在实现一个功能,如果在将数据写入DB时有任何异常,我们应该在失败之前重试它5次。我已经实现了该功能,但无法使用arquillian测试对其进行测试。

我们使用JPA和Versant作为数据库。直到现在,我正在对arquillian测试进行调试,一旦我的流程达到数据库处理程序代码,我就停止了数据库。但这是最糟糕的测试方式。

你有什么建议如何实现同样的目标吗?

2 个答案:

答案 0 :(得分:0)

原生解决方案

在数据库中除以零就有旧技巧。在选择时你可以尝试:

select 1/0 from dual;

插入时间(需要一张表):

insert into test_table (test_number_field) values (1/0);

纯JPA解决方案

您可以尝试使用@Version注释并将其递减以抛出OptimisticLockException。这不是在数据库中引发的,而是在Java层中引发的,但是满足了您的需求。

这些都将导致数据库失败。

答案 1 :(得分:0)

考虑到JPA,最简单的方法是向数据访问层添加方法,使用该方法可以运行本机查询。然后针对不存在的表或类似的东西运行查询。所以在我的DAO实用程序中,我找到了这样的方法:

public List findByNativeQuery(String nativeQuery, Map<String, Object> args) {

    try{

        final EntityManager em = getEntityManager();
        final Query query = em.createNativeQuery(nativeQuery);

        if (args!=null && args.entrySet().size()>0) {
            final Iterator it = args.entrySet().iterator();
            while (it.hasNext()) {
                final Map.Entry pairs = (Map.Entry)it.next();
                query.setParameter(pairs.getKey().toString(), pairs.getValue());
            }
        }

        return query.getResultList();

    }
    catch (RuntimeException e) {
        // throw some new Exception(e.getMessage()); // the best is to throw checked exception
    }

}