在编写数据访问层的单元测试时,遇到不少问题,有些问题可以很容易Google到解决方法,而有些只能自己研究解决。这里分享几个典型的问题以及解决方法。

  先交代一下用到的测试框架 Spring Test + SpringTestDbUnit + DbUnit。

  一、先说一个低级的问题。

  Spring通过<jdbc:embedded-database>标签提供对内存数据的支持,形如:

<jdbc:embeded-database id="dataSource" type="HSQL">

  可是在启动时,却总是提示错误:

  Caused by: org.xml.sax.SAXParseException; lineNumber: 31; columnNumber: 57; cvc-complex-type.2.4.c: 通配符的匹配很全面, 但无法找到元素 'jdbc:embedded-database' 的声明。
  at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198)
  at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:134)
  at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:437)
  ……

  翻来覆去对标签修改了很多次,文档和dtd也看了很多遍,始终没有发现问题。后无意间看到context文件头部对标签的声明上好像有问题:

<beans xmlns=http://www.springframework.org/schema/beans
       xmlns:p=http://www.springframework.org/schema/p
       xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
       xmlns:context=http://www.springframework.org/schema/context
       xmlns:tx=http://www.springframework.org/schema/tx xmlns:jpa=http://www.springframework.org/schema/data/jpa
       xmlns:task=http://www.springframework.org/schema/task xmlns:aop=http://www.springframework.org/schema/aop
       xmlns:jdbc=http://www.springframework.org/schema/jdbc
       xsi:schemaLocation="http://www.springframework.org/schema/<SPAN style="COLOR: #ff0000">tx</SPAN>/spring-jdbc-3.2.xsd">

  仔细看了下,原来当时从tx处复制声明时,只是将后的tx改成了jdbc,却忘记了将路径中tx改为jdbc。更改后,启动正常。所有,如果有同学遇到类似的问题,应该先检查头部。

  二、外键关联导致的删除失败。

  在刚开始写测试时,每个用例单独运行都没有问题,可是一旦一起运行,出现下面的异常:
  Tests run: 5, Failures: 0, Errors: 3, Skipped: 0, Time elapsed: 0.879 sec <<< FAILURE! - in com.noyaxe.nso.service.DeviceServiceTest
  testInitializedForBindedSpaceForceBind(com.noyaxe.nso.service.DeviceServiceTest)  Time elapsed: 0.309 sec  <<< ERROR!
  java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: foreign key no action; FK_L6IDVK78B2TLU8NO6EDJ0G6U8 table: CUSTOM_TABLE_COLUMN_SPACE_TYPE
  at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
  at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
  at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
  ……
  ……

  Caused by: org.hsqldb.HsqlException: integrity constraint violation: foreign key no action; FK_L6IDVK78B2TLU8NO6EDJ0G6U8 table: CUSTOM_TABLE_COLUMN_SPACE_TYPE

  at org.hsqldb.error.Error.error(Unknown Source)
  at org.hsqldb.StatementDML.performReferentialActions(Unknown Source)
  at org.hsqldb.StatementDML.delete(Unknown Source)
  at org.hsqldb.StatementDML.executeDeleteStatement(Unknown Source)
  at org.hsqldb.StatementDML.getResult(Unknown Source)
  at org.hsqldb.StatementDMQL.execute(Unknown Source)
  at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
  at org.hsqldb.Session.executeDirectStatement(Unknown Source)
  at org.hsqldb.Session.execute(Unknown Source)
  at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
  ……