Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa JBOSS Arquillian:如何在运行aquillian测试时强制数据库抛出异常?_Jpa_Jboss_Ejb_Jboss Arquillian_Versant Vod - Fatal编程技术网

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

Jpa JBOSS Arquillian:如何在运行aquillian测试时强制数据库抛出异常?,jpa,jboss,ejb,jboss-arquillian,versant-vod,Jpa,Jboss,Ejb,Jboss Arquillian,Versant Vod,我正在实现一个特性,如果在将数据写入数据库时出现任何异常,我们应该在失败之前重试5次。我已经实现了该特性,但无法使用arquillian测试对其进行测试 我们使用JPA和Versant作为数据库。到目前为止,我正在对arquillian测试进行调试,一旦我的流到达DB处理程序代码,我就会停止数据库。但这是最糟糕的测试方式 您对如何实现这一目标有何建议?本地解决方案 有一个老把戏,就是在数据库中除以零。选择时,您可以尝试: select 1/0 from dual; 插入时间(您需要一个表):

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

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

您对如何实现这一目标有何建议?

本地解决方案

有一个老把戏,就是在数据库中除以零。选择时,您可以尝试:

select 1/0 from dual;
插入时间(您需要一个表):

纯JPA解决方案

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


所有这些都会导致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
    }

}
公共列表findByNativeQuery(字符串nativeQuery,映射参数){
试一试{
最终EntityManager em=getEntityManager();
最终查询查询=em.createNativeQuery(nativeQuery);
如果(args!=null&&args.entrySet().size()>0){
最终迭代器it=args.entrySet().Iterator();
while(it.hasNext()){
final Map.Entry pairs=(Map.Entry)it.next();
query.setParameter(pairs.getKey().toString(),pairs.getValue());
}
}
返回query.getResultList();
}
捕获(运行时异常e){
//抛出一些新异常(例如getMessage());//最好是抛出选中的异常
}
}

你想问一下如何使用JPA框架自动执行数据库N次重试错误场景吗?在可能的解决方案中添加了
OLE
。这家伙在使用JPA,你不能运行特殊查询,你需要将查询映射到类(实体)。你能够做到这一点,请参阅使用本机SQL查询:当然,我想他是在问如何在运行时获得JPA代码抛出错误,是的,正如我在回答中所建议的,方法是本地查询。我之前忘记提到了
OptimisticLockException
。。。这将是一个很好的解决方案。我需要在集成测试中对此进行测试。我不想更改我的实际代码(因为这是将要发布的代码),但我仍然希望在集成测试运行期间使DB在一段时间内不可用。然后使用inmemory数据库进行此用途。从java代码片段开始。Jboss的数据库就是为了这个目的。您可以在src/test/resources中声明它的redource。HQSql。
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
    }

}