Unitils 2.2를 사용하여 DB 테스트케이스를 만들려고 했다.
음. DbUnitModule을 이용하려고 하니 아래와 같은 예외가 발생했다.
at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:157)
at org.unitils.dbunit.DbUnitModule$DbUnitListener.beforeTestSetUp(DbUnitModule.java:540)
at org.unitils.core.Unitils$UnitilsTestListener.beforeTestSetUp(Unitils.java:281)
at org.unitils.UnitilsJUnit4TestClassRunner$TestListenerInvokingMethodRoadie.runBeforesThenTestThenAfters(UnitilsJUnit4TestClassRunner.java:151)
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84)
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
at org.unitils.UnitilsJUnit4TestClassRunner.invokeTestMethod(UnitilsJUnit4TestClassRunner.java:95)
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:59)
at org.unitils.UnitilsJUnit4TestClassRunner.access$000(UnitilsJUnit4TestClassRunner.java:44)
at org.unitils.UnitilsJUnit4TestClassRunner$1.run(UnitilsJUnit4TestClassRunner.java:62)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
at org.unitils.UnitilsJUnit4TestClassRunner.run(UnitilsJUnit4TestClassRunner.java:68)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: org.unitils.core.UnitilsException: No module found of type org.unitils.database.DatabaseModule
at org.unitils.core.ModulesRepository.getModuleOfType(ModulesRepository.java:86)
at org.unitils.dbunit.DbUnitModule.getDatabaseModule(DbUnitModule.java:521)
at org.unitils.dbunit.DbUnitModule.getDefaultDbSupport(DbUnitModule.java:511)
at org.unitils.dbunit.DbUnitModule.getDataSetFactory(DbUnitModule.java:483)
at org.unitils.dbunit.DbUnitModule.getDataSetFactory(DbUnitModule.java:471)
at org.unitils.dbunit.DbUnitModule.getDataSet(DbUnitModule.java:294)
at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:148)
... 18 more
디버그를 열심히 한결과 이런. 아래와 같이 스프링을 사용하고 있는 것이 아닌가.
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
...
...
/**
* Initializes this module using the given <code>Configuration</code>
*
* @param configuration The config, not null
*/
@SuppressWarnings("unchecked")
public void init(Properties configuration) {
this.configuration = configuration;
defaultAnnotationPropertyValues = getAnnotationPropertyDefaults(DatabaseModule.class, configuration, Transactional.class);
updateDatabaseSchemaEnabled = PropertyUtils.getBoolean(PROPERTY_UPDATEDATABASESCHEMA_ENABLED, configuration);
wrapDataSourceInTransactionalProxy = PropertyUtils.getBoolean(PROPERTY_WRAP_DATASOURCE_IN_TRANSACTIONAL_PROXY, configuration);
}
...
현재 단계에서 스프링은 사용하고 있지 않다. 일단은 스프링관련 라이브러리를 넣어 봤다.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>2.0.2</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>2.0.2</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>2.0.2</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-dao</artifactId>
<version>2.0.2</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-hibernate3</artifactId>
<version>2.0.2</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
일단은 위의 에러는 없어졌다. 그런데 이건 또 뭐뇨..
hsqldb를 사용하여 독립적인 테스트 케이스를 만들고 싶었기 때문에
이 고생을 했는데 결국 초기화 SQL를 실행해야 한다는 결론이다.
Hibernate를 사용하다 간만에 iBATIS를 사용하려고 하니 이런 점들이 힘들게 느껴진다.
에겅. 이럴바에야 Annotation을 사용하는 대신에 그냥 DbUnit을 사용하고 말겠다.
at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:157)
at org.unitils.dbunit.DbUnitModule$DbUnitListener.beforeTestSetUp(DbUnitModule.java:540)
at org.unitils.core.Unitils$UnitilsTestListener.beforeTestSetUp(Unitils.java:281)
at org.unitils.UnitilsJUnit4TestClassRunner$TestListenerInvokingMethodRoadie.runBeforesThenTestThenAfters(UnitilsJUnit4TestClassRunner.java:151)
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84)
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
at org.unitils.UnitilsJUnit4TestClassRunner.invokeTestMethod(UnitilsJUnit4TestClassRunner.java:95)
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:59)
at org.unitils.UnitilsJUnit4TestClassRunner.access$000(UnitilsJUnit4TestClassRunner.java:44)
at org.unitils.UnitilsJUnit4TestClassRunner$1.run(UnitilsJUnit4TestClassRunner.java:62)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
at org.unitils.UnitilsJUnit4TestClassRunner.run(UnitilsJUnit4TestClassRunner.java:68)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: org.unitils.core.UnitilsException: Error while executing DataSetLoadStrategy
at org.unitils.dbunit.datasetloadstrategy.impl.BaseDataSetLoadStrategy.execute(BaseDataSetLoadStrategy.java:46)
at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:231)
at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:154)
... 18 more
Caused by: org.dbunit.dataset.NoSuchTableException: CUSTOMER
at org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:192)
at org.dbunit.operation.AbstractOperation.getOperationMetaData(AbstractOperation.java:59)
at org.dbunit.operation.RefreshOperation.execute(RefreshOperation.java:88)
at org.unitils.dbunit.datasetloadstrategy.impl.RefreshLoadStrategy.doExecute(RefreshLoadStrategy.java:46)
at org.unitils.dbunit.datasetloadstrategy.impl.BaseDataSetLoadStrategy.execute(BaseDataSetLoadStrategy.java:44)
... 20 more
결론 : 스프링을 써야 하는가?