2

I'm doing DBUnit 2.5.0 and h2 db, a memory database 1.4.180 for TestNG. I use DBUnit to export dataschema from db (PostgreSQL). Then I use this xml file for H2 DB, but whenever I run testNG, it thrown an exception:

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)

I have tried a lot, but I can't find solution to fix it. Could you please help me? This's my all class: I have create a class to self-define an annotation: DATASET

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DataSet {
    String setUpDataSet() default "";
}

One listener class for @DATASET too:

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;
    }
}

And apply it on my unittest class:

@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));
    }

And this's my test-context.xml file:

<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>

Thank for your help! Phong Nguyen

Thomas Mueller
  • 48,905
  • 14
  • 116
  • 132
Phong Nguyen
  • 277
  • 4
  • 16

0 Answers0