我正在使用DBUnit 2.5.0和h2 db,一个用于TestNG的内存数据库1.4.180。我使用DBUnit从db(PostgreSQL)导出dataschema。然后我将这个xml文件用于H2 DB,但每当我运行testNG时,它都抛出异常:
org.dbunit.dataset.NoSuchTableException: result
at org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:288)
at org.dbunit.operation.DeleteAllOperation.execute(DeleteAllOperation.java:109)
at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79)
at org.dbunit.AbstractDatabaseTester.executeOperation(AbstractDatabaseTester.java:190)
at org.dbunit.AbstractDatabaseTester.onSetup(AbstractDatabaseTester.java:103)
at com.axonactive.TestSystemListener.TestSystemListener.beforeTestMethod(TestSystemListener.java:49)
at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:368)
at org.springframework.test.context.testng.AbstractTestNGSpringContextTests.springTestContextBeforeTestMethod(AbstractTestNGSpringContextTests.java:159)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:564)
at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:213)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:653)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
at org.testng.TestRunner.privateRun(TestRunner.java:767)
at org.testng.TestRunner.run(TestRunner.java:617)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
at org.testng.SuiteRunner.run(SuiteRunner.java:240)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
at org.testng.TestNG.run(TestNG.java:1057)
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)
我已经尝试了很多,但我找不到解决方法来修复它。请你帮助我好吗? 这是我的全班: 我创建了一个自定义注释的类:DATASET
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DataSet {
String setUpDataSet() default "";
}
@DATASET的一个监听器类:
public class TestSystemListener implements TestExecutionListener {
private IDatabaseTester databaseTester;
@Override
public void afterTestClass(TestContext testContext) throws Exception {
}
@Override
public void afterTestMethod(TestContext testContext) throws Exception {
}
@Override
public void beforeTestClass(TestContext testContext) throws Exception {
}
@Override
public void beforeTestMethod(TestContext testContext) throws Exception {
DataSet dataSet = testContext.getTestMethod().getAnnotation(
DataSet.class);
if (dataSet == null) {
return;
}
String dataFile = dataSet.setUpDataSet();
if (!dataFile.isEmpty()) {
databaseTester = new DataSourceDatabaseTester(
(DataSource) testContext.getApplicationContext().getBean(
"dataSource"));
databaseTester.setDataSet(getDataSet(dataFile));
databaseTester.setSetUpOperation(getSetupOperation());
databaseTester.onSetup();
}
}
@Override
public void prepareTestInstance(TestContext testContext) throws Exception {
}
protected IDataSet getDataSet(String dataFile) throws Exception {
final FlatXmlDataSetBuilder builder = new FlatXmlDataSetBuilder();
builder.setColumnSensing(true);
return builder.build(new File(dataFile));
}
protected DatabaseOperation getSetupOperation() {
return DatabaseOperation.CLEAN_INSERT;
}
}
并将其应用于我的unittest课程:
@ContextConfiguration(locations = { "classpath:test-context.xml" })
@TestExecutionListeners(listeners = { TestSystemListener.class })
public class QuestionLevelTest extends
AbstractTransactionalTestNGSpringContextTests {
@Autowired
private IResultService resultService;
private final String DATASET = "./src/test/resources/database/partialdb.xml";
@DataSet(setUpDataSet = DATASET)
@Test
public void addQuestionLevel() {
Result r = new Result();
r.setId(192019);
Assert.assertTrue(resultService.add(r));
}
这是我的test-context.xml文件:
<beans:bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<beans:property name="driverClassName" value="org.h2.Driver" />
<beans:property name="url" value="jdbc:h2:mem:dataset;MODE=PostgreSQL" />
<beans:property name="username" value="sa" />
<beans:property name="password" value="" />
</beans:bean>
<beans:bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<beans:property name="dataSource" ref="dataSource" />
<beans:property name="packagesToScan" value="com.axonactive.domain"></beans:property>
<beans:property name="hibernateProperties">
<beans:props>
<beans:prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</beans:prop>
<beans:prop key="hibernate.show_sql">true</beans:prop>
<beans:prop key="hibernate.c3p0.max_statements">${hibernate.c3p0.max_statements}</beans:prop>
<beans:prop key="hibernate.hbm2ddl.auto">create-drop</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
感谢您的帮助! Phong Nguyen