테스트 중 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 |