본문 바로가기

개발환경

Unitils 에서 DbUnit 사용시 발생하는 에러와 원인

Unitils 2.2를 사용하여 DB 테스트케이스를 만들려고 했다.
음. DbUnitModule을 이용하려고 하니 아래와 같은 예외가 발생했다.

org.unitils.core.UnitilsException: Error inserting test data from DbUnit dataset for method public void kr.nextree.component.insurance.dao.CustomerDaoTest.testCreateCustomer()
 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);

        PlatformTransactionManager.class.getName();
    }
    ...

현재 단계에서 스프링은 사용하고 있지 않다. 일단은 스프링관련 라이브러리를 넣어 봤다.

<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을 사용하고 말겠다.

org.unitils.core.UnitilsException: Error inserting test data from DbUnit dataset for method public void kr.nextree.component.insurance.dao.CustomerDaoTest.testCreateCustomer()
 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

결론 : 스프링을 써야 하는가?