【问题标题】:How to get the original error from a failing JUnit test?如何从失败的 JUnit 测试中获取原始错误?
【发布时间】:2013-07-24 09:12:29
【问题描述】:

我正在为数据库应用程序编写 JUnit 测试。针对我的测试(HSQLDB)数据库运行测试失败。我希望喜欢得到的错误消息是这条错误消息,这是实际的异常,我完全理解:

org.hsqldb.HsqlException: Violation of unique constraint SYS_PK_47: duplicate value(s) for column(s) SECONDARY_ACCOUNT_ID

但是,此信息不会出现在测试失败的堆栈跟踪中任何地方。相反,错误似乎是通过 Spring、Hibernate 和 JDBC 过滤的,我得到了这个完全无用、无信息的“JDBC 异常”:

org.springframework.orm.hibernate3.HibernateJdbcException: JDBC exception on Hibernate data access: SQLException for SQL [insert into CAACCTS (CREDIT_APPLICATION_ID, PRIMARY_ACCOUNT_NUMBER, SECONDARY_ACCOUNT_ID, SECONDARY_ACCT_NAME, SECONDARY_ADDY_ID, SECONDARY_ACCOUNT_NUMBER) values (?, ?, ?, ?, ?, ?)]; SQL state [null]; error code [0]; Could not execute JDBC batch update; nested exception is org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:651)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:104)
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:516)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.data.jpa.repository.support.LockModeRepositoryPostProcessor$LockModePopulatingMethodIntercceptor.invoke(LockModeRepositoryPostProcessor.java:92)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at $Proxy26.save(Unknown Source)
    [snip]

我已经将 Log4J 日志设置为一直到 TRACE,但没有成功。谁能告诉我如何抓住这个原始错误(不仅在这个失败的测试中,而且在未来的测试中也是如此?)

我正在使用 HSQLDB、Spring 3、Hibernate 3.6 和 JPA 2。我的 IDE 是 Intellij IDEA。该项目是基于 Maven 的。如果需要帮助我诊断此问题,我将很乐意提供更多详细信息。

【问题讨论】:

    标签: java spring hibernate junit hsqldb


    【解决方案1】:

    我认为最好捕获 org.hibernate.JDBCException 或检查 Hibernate 异常是否是 org.hibernate.JDBCException 的实例:

    } catch (JDBCException e) {
        logger.warn("jdbc problem", e.getSQLException());
    }
    

    或者...

    if (e instanceof JDBCException) {
        SQLException sqle = ((JDBCException) e).getSQLException();
    }
    

    通常休眠的 JDBCException 包含相关的 DB 特定 JDBC 异常,您可以使用 getSQLException() 方法检索它

    【讨论】:

      【解决方案2】:

      一种深入到根异常的方法是这样的:

      catch(Throwable t)
      {
          while(t.getCause != null)
          {
              t = t.getCause();
          }
          t.printStackTrace(System.out);
      }
      

      【讨论】:

      • 不,我只是得到了原来的错误。在 Hibernate 或 HSQLDB 内部的某个地方,它正在捕获该错误并抛出一个新错误。
      • 嗯,这很烦人。如果您在 org.springframework.orm.hibernate3 和 org.hsqldb 上的跟踪记录没有返回任何内容,我不知道有一种方法可以检索尚未作为原因传递的异常。您可以尝试查看错误起源的休眠源代码(at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:651)),看看是否可以为您提供任何线索
      • 恐怕这就是我必须要做的。无论如何,谢谢。
      • 您是否尝试过使用直接 JDBC 触发相同的 HSQLDB 错误?在这种情况下,异常看起来如何?
      猜你喜欢
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      • 1970-01-01
      • 2015-09-03
      • 1970-01-01
      • 2011-03-29
      • 2019-05-02
      相关资源
      最近更新 更多