테스트 중 DBUnit에서 다음과 같은 에러 메세지가 뜨면서 테스트 실패.

WARNING - SERVICES.SERVICEAVAILABLE data type (16, ‘BOOLEAN’) not recognized and will be ignored. See FAQ for more information.


errror tracing 을 보니


org.dbunit.dataset.NoSuchColumnException: Services.serviceAvailable
 at org.dbunit.operation.AbstractOperation.getOperationMetaData(AbstractOperation.java:71)
 at org.dbunit.operation.AbstractBatchOperation.execute(AbstractBatchOperation.java:129)
 at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:67)
 at org.dbunit.DatabaseTestCase.executeOperation(DatabaseTestCase.java:87)
 at org.dbunit.DatabaseTestCase.setUp(DatabaseTestCase.java:104)
 at test.util.AbstractDBTestCase.setUp(AbstractDBTestCase.java:52)
 at com.intel.mapper.ServiceMapper_Test.setUp(ServiceMapper_Test.java:16)
 at junit.framework.TestCase.runBare(TestCase.java:125)
 at junit.framework.TestResult$1.protect(TestResult.java:106)
 at junit.framework.TestResult.runProtected(TestResult.java:124)
 at junit.framework.TestResult.run(TestResult.java:109)
 at junit.framework.TestCase.run(TestCase.java:118)
 at junit.framework.TestSuite.runTest(TestSuite.java:208)
 at junit.framework.TestSuite.run(TestSuite.java:203)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)


NoSuchColumnException 이라고는 하지만 column 이름은 정확한 상태... 검색해보니 DBUnit에서 Boolean 을 인식하지 못하는 것이라고 함.


해결책은 두단계로 나뉘는데

1. dbunit의 DefaultDataTypeFactory를 상속해서 createDataType 메소드에 내용 추가.

2. IDatabaseConnection 인스턴스에서 DatabaseConfig에 1에서 만든 factory를 지정.



첫번째 단계에서 만든 코드.


import java.sql.Types;

import org.dbunit.dataset.datatype.DataType;
import org.dbunit.dataset.datatype.DataTypeException;
import org.dbunit.dataset.datatype.DefaultDataTypeFactory;


public class HsqlDataTypeFactory extends DefaultDataTypeFactory {

    public HsqlDataTypeFactory()
    {
        super();
    }
    public DataType createDataType(int sqlType, String sqlTypeName)

    throws DataTypeException
    {
        if ( sqlType == Types.BOOLEAN )
            return DataType.BOOLEAN;

        return super.createDataType(sqlType, sqlTypeName);
    }
}


두번째로 위 factory 인스턴스를 지정해주기.


    protected IDatabaseConnection getConnection() throws Exception {
        Class.forName(desc.getDriverClassName());
        Connection conn =DriverManager.getConnection(
            desc.getConnectionUrl(),
            desc.getUser(),
            desc.getPassword());
        // the below code is needed to process 'BOOLEAN' data type.
        IDatabaseConnection dbConn = new DatabaseConnection(conn);
        DatabaseConfig config = dbConn.getConfig();
        config.setProperty(
                DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
                new HsqlDataTypeFactory());

          return dbConn;
    }


이렇게 하면 BOOLEAN 이 인식된다.


REF : http://www.carbonfive.com/community/archives/2005/07/dbunit_hsql_and.html

'Dev > Java' 카테고리의 다른 글

.getClass() 와 .class의 차이점  (0) 2007.11.18
TimeZone Bug  (0) 2007.11.14
eclipse 에서 라이브러리 추가하기  (0) 2007.10.18
Posted by yeori
,