【问题标题】:JBOSS Arquillian : How to force database to throw exception while running the aquillian test?JBOSS Arquillian:如何在运行 aquillian 测试时强制数据库抛出异常?
【发布时间】:2016-10-15 08:28:17
【问题描述】:

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

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

你有什么建议可以达到同样的效果吗?

【问题讨论】:

  • 你想问如何使用JPA框架自动化数据库N次重试错误场景?
  • 在可能的解决方案中添加了OLE

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


【解决方案1】:

考虑到 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
    }

}

【讨论】:

  • 我需要在集成测试中对此进行测试。我不想更改我的实际代码(因为这是即将发布的代码),但我仍然希望在我的集成测试运行时让数据库在一段时间内不可用。
  • 然后为此目的使用内存数据库。使用 java 代码 sn -p 启动它。 Jboss 有专门用于此目的的数据库。你在 src/test/resources 中声明它的 redources。 HQSql.
【解决方案2】:

原生解决方案

在数据库中有除以零的老技巧。在选择时您可以尝试:

select 1/0 from dual;

插入时间(需要表格):

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

纯 JPA 解决方案

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

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

【讨论】:

  • 这家伙正在使用 JPA,您无法运行临时查询,您需要将查询映射到类(实体)。
  • 你可以做到,请参阅利用原生 SQL 查询oracle.com/technetwork/articles/vasiliev-jpql-087123.html
  • 当然,我认为他是在问如何让 JPA 代码在运行时抛出错误,是的,正如我在回答中所建议的那样,方法是原生查询。
  • 好吧,我之前忘了提OptimisticLockException...这将是一个很好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 2016-12-15
  • 2012-08-21
  • 2015-07-15
  • 2013-01-20
相关资源
最近更新 更多