我正在实现一个功能,如果在将数据写入数据库时出现任何异常,我们应该在失败之前重试 5 次。我已经实现了该功能,但无法使用 arquillian 测试对其进行测试。
我们使用 JPA 和 Versant 作为数据库。到目前为止,我正在调试 arquillian 测试,一旦我的流程到达 DB 处理程序代码,我将停止数据库。但这是最糟糕的测试方式。
你有什么建议如何达到同样的效果吗?
我正在实现一个功能,如果在将数据写入数据库时出现任何异常,我们应该在失败之前重试 5 次。我已经实现了该功能,但无法使用 arquillian 测试对其进行测试。
我们使用 JPA 和 Versant 作为数据库。到目前为止,我正在调试 arquillian 测试,一旦我的流程到达 DB 处理程序代码,我将停止数据库。但这是最糟糕的测试方式。
你有什么建议如何达到同样的效果吗?
考虑到 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
}
}
原生解决方案
在数据库中除以零是一个老技巧。在选择时,您可以尝试:
select 1/0 from dual;
插入时间(你需要一个表):
insert into test_table (test_number_field) values (1/0);
纯 JPA 解决方案
您可以尝试利用@Version
注释并将其递减以 throw OptimisticLockException
。这不是在数据库中抛出,而是在 Java 层中抛出,但可以满足您的需求。
这些都会导致数据库失败。