2016-06-23 12 views
2

Ich versuche, spring test dbunit zu verwenden.org.dbunit.dataset.NoSuchTableException: localized_values ​​

https://springtestdbunit.github.io/spring-test-dbunit/

Als ich Frühling bin mit 4.1.x ich entschieden Version dbunit1.2.1 für spring-test-dbunit und 2.5.2 für den Kern zu verwenden.

Ursprünglich verwendete ich einfach dbunit und es hat gut funktioniert. Dann entschied ich mich zu versuchen spring-test-dbunit und ich habe mehrere Probleme.

Hier ist meine Testklasse

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(value = { 
     "classpath:path/to/test/context/sql-context.xml"}) 
@TransactionConfiguration(defaultRollback = true) 
@Transactional 
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class, 
    TransactionalTestExecutionListener.class, DbUnitTestExecutionListener.class }) 
@DbUnitConfiguration(databaseConnection = "databaseConnection") 
@DatabaseSetup("classpath:path/to/dataset/questionRepositoryTestDS.xml") 
public class QuestionRepositoryDbUnitTest { 

    .... 

    @Autowired 
    private QuestionRepository repository; 

    @Test 
    public void mustReturnQuestion() throws Exception { 
     .... 
     assertEquals("Result is not the same as expected!", expected, 
       repository.findQuestion(QUESTION_ID_1, PRODUCT_CONFIGURATION_ID_1, LANGUAGE)); 
    } 

Meine Daten-Set-Datei wie diese Bohne wie diese

<bean id="databaseConnection" 
     class="com.github.springtestdbunit.bean.DatabaseDataSourceConnectionFactoryBean"> 
    <property name="schema" value="mySchema"/> 
    <property name="dataSource" ref="customDataSource"/> 
</bean> 

sieht

<?xml version="1.0" encoding="UTF-8"?> 
<dataset> 
    <question question_id='q_mail' display_type='EMAIL' display_group='2' organization_uid='123' display_order='1'/> 
    <question question_id='q_copies' display_type='NUMBER' display_group='1' organization_uid='123' display_order='1'/> 

    <localized_question question_id='q_mail' language='EN' organization_uid='*' display_label='What is your email?'/> 
    <localized_question question_id='q_mail' language='EN' organization_uid='123' display_label='Enter the mailbox'/> 
    <localized_question question_id='q_copies' language='EN' organization_uid='*' display_label='How many copies you are planning to create?'/> 


    <localized_values question_select_value_id='a_mail1' language='EN' organization_uid='*' display_label='[email protected]'/> 
    <localized_values question_select_value_id='a_mail1' language='EN' organization_uid='123' display_label='[email protected]'/> 
    <localized_values question_select_value_id='a_mail2' language='EN' organization_uid='*' display_label='[email protected]'/> 
</dataset> 

Datenbankverbindung sieht, wo dataSource Bohne

012 ist

Aber wenn ich versuche Test auszuführen bekomme ich diesen Fehler

org.dbunit.dataset.NoSuchTableException: localized_values 
    at org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:305) 
    at org.dbunit.operation.DeleteAllOperation.execute(DeleteAllOperation.java:109) 
    at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79) 
    at com.github.springtestdbunit.DbUnitRunner.setupOrTeardown(DbUnitRunner.java:194) 
    at com.github.springtestdbunit.DbUnitRunner.beforeTestMethod(DbUnitRunner.java:66) 
    at com.github.springtestdbunit.DbUnitTestExecutionListener.beforeTestMethod(DbUnitTestExecutionListener.java:186) 
    at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:249) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:70) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:224) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:83) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:163) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:86) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:49) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:64) 
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:50) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
    at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32) 
    at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93) 
    at com.sun.proxy.$Proxy2.processTestClass(Unknown Source) 
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:106) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
    at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:360) 
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54) 
    at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

Was ist das Problem?

Auch wenn ich verwendet Ebene dbunit I autoCommit setzen, um musste es

databaseConnection = new DatabaseConnection(h2databaseResource.getConnection(), DATABASE_SCHEMA); 
    databaseConnection.getConnection().setAutoCommit(true); 

funktioniert (obwohl ich dachte, dass autoCommit soll true standardmäßig sein)

Antwort

0

Ich weiß, dass dies eine späte Antwort, aber ich denke, Ihr Problem ist, dass Sie Ihr Schema nicht korrekt erstellt haben. Ich sehe, dass Sie eine benutzerdefinierte Datenquelle Fabrik verwenden, und ich würde Sie empfehlen, eine standardisierte DB Initialisierung mit umschalten, wie diese Konfiguration in Ihrem Test XML setzen:

<jdbc:initialize-database data-source="dataSource"> 
    <jdbc:script location="classpath:com/foo/sql/db-schema.sql"/> 
</jdbc:initialize-database> 

oder eine Test @Configuration Klasse erklärt:

@Configuration 
public class TestDbConfig { 

    @Value("classpath:com/foo/sql/db-schema.sql") 
    private Resource schemaScript; 

    @Bean 
    public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) { 
     final DataSourceInitializer initializer = new DataSourceInitializer(); 
     initializer.setDataSource(dataSource); 
     initializer.setDatabasePopulator(databasePopulator()); 
     return initializer; 
    } 

    private DatabasePopulator databasePopulator() { 
     final ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); 
     populator.addScript(schemaScript); 
     return populator; 
    } 

}