Java DBunit-无法进行类型转换<;1997/02/14>;时间戳
接下来,我将使用DBUnit(2.49)+Hibernate(4.1.3)进行集成测试Java DBunit-无法进行类型转换<;1997/02/14>;时间戳,java,hibernate,hsqldb,dbunit,Java,Hibernate,Hsqldb,Dbunit,接下来,我将使用DBUnit(2.49)+Hibernate(4.1.3)进行集成测试 String formats[] = {"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need Timestamp ts = null; for (int i = 0; i < formats.length; i++) { SimpleDateFormat sdf = new S
String formats[] =
{"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
Timestamp ts = null;
for (int i = 0; i < formats.length; i++)
{
SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
try {
java.util.Date date = sdf.parse(stringValue);
ts = new Timestamp(date.getTime());
return ts;
}
catch( ParseException e) {
}
- 生产数据库:Oracle 10
- 测试数据库:Hsqldb 2.3.3
上下文 我的数据包含日期的当前格式:
yyyy/MM/dd
。但是,根据DBUnit常见问题解答,DBUnit只支持这种格式yyyy-mm-dd hh:mm:ss.fffffffff
,因此我必须为时间戳创建一种新格式
String formats[] =
{"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
Timestamp ts = null;
for (int i = 0; i < formats.length; i++)
{
SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
try {
java.util.Date date = sdf.parse(stringValue);
ts = new Timestamp(date.getTime());
return ts;
}
catch( ParseException e) {
}
我是如何试图修复它的
- 我基于此创建了一个
。我改变了这部分:CustomTimeStampDataType
String formats[] = {"yyyy-MM-dd HH:mm", "yyyy-MM-dd HH:mm a", "yyyy-MM-dd HH:mm:ss.fffffffff"};
String formats[] = {"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need Timestamp ts = null; for (int i = 0; i < formats.length; i++) { SimpleDateFormat sdf = new SimpleDateFormat(formats[i]); try { java.util.Date date = sdf.parse(stringValue); ts = new Timestamp(date.getTime()); return ts; } catch( ParseException e) { }
String formats[] = {"yyyy/MM/dd"};
String formats[] =
{"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
Timestamp ts = null;
for (int i = 0; i < formats.length; i++)
{
SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
try {
java.util.Date date = sdf.parse(stringValue);
ts = new Timestamp(date.getTime());
return ts;
}
catch( ParseException e) {
}
- 我按照相同的教程创建了一个
。我只让它扩展CustomeDataTypeFactory
,而不是Oracle10DataTypeFactory
defaultdatatypefactory
- 在
中,我使用以下内容覆盖hibernatedbunitestcase
:setDatabaseConfig()
@Override protected void setUpDatabaseConfig(DatabaseConfig config){ config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new CustomDataTypeFactory()); }
String formats[] = {"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need Timestamp ts = null; for (int i = 0; i < formats.length; i++) { SimpleDateFormat sdf = new SimpleDateFormat(formats[i]); try { java.util.Date date = sdf.parse(stringValue); ts = new Timestamp(date.getTime()); return ts; } catch( ParseException e) { }
org.dbunit.dataset.datatype.TypeCastException: Unable to typecast value <1997/02/14> of type <java.lang.String> to TIMESTAMP
at org.dbunit.dataset.datatype.TimestampDataType.typeCast(TimestampDataType.java:120)
at org.dbunit.dataset.datatype.TimestampDataType.setSqlValue(TimestampDataType.java:176)
at org.dbunit.database.statement.SimplePreparedStatement.addValue(SimplePreparedStatement.java:73)
at org.dbunit.operation.RefreshOperation$RowOperation.execute(RefreshOperation.java:189)
at org.dbunit.operation.RefreshOperation.execute(RefreshOperation.java:113)
at org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190)
at org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103)
at org.dbunit.DatabaseTestCase.setUp(DatabaseTestCase.java:156)
at test.HibernateDbUnitTestCase.setUp(HibernateDbUnitTestCase.java:85)
at test.PlayerTest.setUp(PlayerTest.java:117)
Caused by: java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
at java.sql.Timestamp.valueOf(Unknown Source)
at org.dbunit.dataset.datatype.TimestampDataType.typeCast(TimestampDataType.java:116)
... 20 more
String formats[] =
{"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
Timestamp ts = null;
for (int i = 0; i < formats.length; i++)
{
SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
try {
java.util.Date date = sdf.parse(stringValue);
ts = new Timestamp(date.getTime());
return ts;
}
catch( ParseException e) {
}
org.dbunit.dataset.datatype.TypeCastException:无法将类型的值类型转换为时间戳
位于org.dbunit.dataset.datatype.TimestampDataType.typeCast(TimestampDataType.java:120)
位于org.dbunit.dataset.datatype.TimestampDataType.setSqlValue(TimestampDataType.java:176)
位于org.dbunit.database.statement.SimplePreparedStatement.addValue(SimplePreparedStatement.java:73)
位于org.dbunit.operation.RefreshOperation$RowOperation.execute(RefreshOperation.java:189)
位于org.dbunit.operation.RefreshOperation.execute(RefreshOperation.java:113)
位于org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190)
位于org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103)
位于org.dbunit.DatabaseTestCase.setUp(DatabaseTestCase.java:156)
在test.hibernatedbunitestcase.setUp(hibernatedbunitestcase.java:85)
在test.PlayerTest.setUp(PlayerTest.java:117)
原因:java.lang.IllegalArgumentException:时间戳格式必须为yyyy-mm-dd hh:mm:ss[.fffffffff]
位于java.sql.Timestamp.valueOf(未知源)
位于org.dbunit.dataset.datatype.TimestampDataType.typeCast(TimestampDataType.java:116)
... 20多
这很奇怪,似乎我的CustomTimeStamp没有被调用,所以我使用默认格式更改了数据集中的日期:1997-02-14 00:00:00.0,然后再次运行单元测试。然后我得到:
org.dbunit.dataset.datatype.TypeCastException: Unable to typecast value <1997-02-14 00:00:00.0> of type <java.lang.String> to TIMESTAMP
at test.CustomTimestampDataType.typeCast(CustomTimestampDataType.java:69)
at test.CustomTimestampDataType.setSqlValue(CustomTimestampDataType.java:84)
at org.dbunit.database.statement.SimplePreparedStatement.addValue(SimplePreparedStatement.java:73)
at org.dbunit.operation.RefreshOperation$RowOperation.execute(RefreshOperation.java:189)
at org.dbunit.operation.RefreshOperation.execute(RefreshOperation.java:113)
at org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190)
at org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103)
at org.dbunit.DatabaseTestCase.setUp(DatabaseTestCase.java:156)
at test.HibernateDbUnitTestCase.setUp(HibernateDbUnitTestCase.java:85)
at test.PlayerTest.setUp(PlayerTest.java:117)
String formats[] =
{"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
Timestamp ts = null;
for (int i = 0; i < formats.length; i++)
{
SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
try {
java.util.Date date = sdf.parse(stringValue);
ts = new Timestamp(date.getTime());
return ts;
}
catch( ParseException e) {
}
org.dbunit.dataset.datatype.TypeCastException:无法将类型的值类型转换为时间戳
在test.CustomTimestampDataType.typeCast(CustomTimestampDataType.java:69)中
在test.CustomTimestampDataType.setSqlValue(CustomTimestampDataType.java:84)
位于org.dbunit.database.statement.SimplePreparedStatement.addValue(SimplePreparedStatement.java:73)
位于org.dbunit.operation.RefreshOperation$RowOperation.execute(RefreshOperation.java:189)
位于org.dbunit.operation.RefreshOperation.execute(RefreshOperation.java:113)
位于org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190)
位于org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103)
位于org.dbunit.DatabaseTestCase.setUp(DatabaseTestCase.java:156)
在test.hibernatedbunitestcase.setUp(hibernatedbunitestcase.java:85)
在test.PlayerTest.setUp(PlayerTest.java:117)
这意味着CustomTimeStamp实际上被称为。这个问题似乎源于DatabaseTestCase.setUp,它以某种方式调用了错误的TimeStampDataType
String formats[] =
{"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
Timestamp ts = null;
for (int i = 0; i < formats.length; i++)
{
SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
try {
java.util.Date date = sdf.parse(stringValue);
ts = new Timestamp(date.getTime());
return ts;
}
catch( ParseException e) {
}
如何解决此问题?
- 我的第一个选择是使用正则表达式将数据集中的每个
替换为yyyy/MM/dd
。这很好,直到我不得不测试一个方法,该方法根据请求选择一个日期(因此格式为YYYYMM dd)并将其与当前日期进行比较。(因此格式为yyyy/mm/dd)。Hsqldb无法比较两个格式不同的日期yyy-MM-dd
String formats[] =
{"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
Timestamp ts = null;
for (int i = 0; i < formats.length; i++)
{
SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
try {
java.util.Date date = sdf.parse(stringValue);
ts = new Timestamp(date.getTime());
return ts;
}
catch( ParseException e) {
}
String formats[] =
{"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
Timestamp ts = null;
for (int i = 0; i < formats.length; i++)
{
SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
try {
java.util.Date date = sdf.parse(stringValue);
ts = new Timestamp(date.getTime());
return ts;
}
catch( ParseException e) {
}
提前谢谢修复了它
String formats[] =
{"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
Timestamp ts = null;
for (int i = 0; i < formats.length; i++)
{
SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
try {
java.util.Date date = sdf.parse(stringValue);
ts = new Timestamp(date.getTime());
return ts;
}
catch( ParseException e) {
}
所以我最终选择了第二种选择。
这是那些需要它的人的详细路径
String formats[] =
{"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need
Timestamp ts = null;
for (int i = 0; i < formats.length; i++)
{
SimpleDateFormat sdf = new SimpleDateFormat(formats[i]);
try {
java.util.Date date = sdf.parse(stringValue);
ts = new Timestamp(date.getTime());
return ts;
}
catch( ParseException e) {
}
- 下载
dbUnit.2.2.source.jar
- 打开罐子的拉链
- 转到Eclipse,
File>New>Java项目
- 取消选中“使用默认位置”
- 在位置:指定从jar创建的新文件夹的路径
- 单击
Finish
- 修改TimestampDataType.java(如果需要)
String formats[] = {"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need Timestamp ts = null; for (int i = 0; i < formats.length; i++) { SimpleDateFormat sdf = new SimpleDateFormat(formats[i]); try { java.util.Date date = sdf.parse(stringValue); ts = new Timestamp(date.getTime()); return ts; } catch( ParseException e) { }
- 而不是
ts=java.sql.Timestamp.valueOf(stringValue)代码>使用下面的代码
String formats[] = {"dd/MM/yyyy HH:mm:ss.SS"}; //and more depending on your need Timestamp ts = null; for (int i = 0; i < formats.length; i++) { SimpleDateFormat sdf = new SimpleDateFormat(formats[i]); try { java.util.Date date = sdf.parse(stringValue); ts = new Timestamp(date.getTime()); return ts; } catch( ParseException e) { }
- 而不是
- 右键单击项目,然后导出
- 选择
,然后选择JAR文件
Next
- 填写导出目的地,然后
Finish
- 您只需将这个新的jar添加到库中即可使其正常工作