2013-07-24 55 views
0

我正在为数据库应用程序编写JUnit测试。对我的测试(HSQLDB)数据库运行时,测试失败。该错误消息我会喜欢得到的是此错误信息,这是实际的例外,这我完全理解:如何从失败的JUnit测试中获取原始错误?

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

然而,这些信息不会出现任何地方测试的堆栈跟踪失败。相反,错误似乎通过春,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的。如果需要帮助我诊断,我会很乐意提供更多详细信息。

向下钻取到根异常

回答

0

一种方法是这样的:

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

不,我只是让原有的错误了。在Hibernate或HSQLDB的大潮中,它正在捕获该错误并抛出一个新错误。 – user1071914

+0

嗯,这很烦人。如果在org.springframework.orm.hibernate3和org.hsqldb上的跟踪记录没有返回任何内容,我不知道如何检索尚未作为原因传递的异常。你可以试着看看发生错误的hibernate源代码('org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:651)'),看看是否给你提供任何线索 – StormeHawke

+0

恐怕这就是我将不得不做的事情。不管怎么说,还是要谢谢你。 – user1071914

0

我觉得还好赶上org.hibernate.JDBCException或检查休眠的例外是组织的一个实例。 hibernate.JDBCException

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

或...

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

通常冬眠的JDBCException包含相关数据库JDBC特定例外的可以检索使用getSQLException()方法