3

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

我们使用 JPA 和 Versant 作为数据库。到目前为止,我正在调试 arquillian 测试,一旦我的流程到达 DB 处理程序代码,我将停止数据库。但这是最糟糕的测试方式。

你有什么建议如何达到同样的效果吗?

4

2 回答 2

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
    }

}
于 2016-08-09T10:54:28.550 回答
0

原生解决方案

在数据库中除以零是一个老技巧。在选择时,您可以尝试:

select 1/0 from dual;

插入时间(你需要一个表):

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

纯 JPA 解决方案

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

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

于 2016-08-08T14:39:21.860 回答