2016-06-23 5 views
2

Я пытаюсь использовать spring test dbunit.org.dbunit.dataset.NoSuchTableException: localized_values ​​

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

Как я использую весной 4.1.x я решил использовать версию 1.2.1 для spring-test-dbunit и 2.5.2 для ядра dbunit.

Первоначально я использовал простой dbunit, и он отлично работал. Затем я решил попробовать spring-test-dbunit, и у меня появилось несколько проблем.

Вот мой тестовый класс

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

Мой файл набора данных выглядит следующим образом

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

соединении с базой данных боб выглядит следующим образом

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

где dataSource боб

<bean id="customDataSource" 
      class="com.custom.db.embedded.EmbeddedH2DatabaseFactory"> 
     <property name="resourcesFromPaths"> 
      <list value-type="java.lang.String"> 
       <value>#{systemProperties['test-changelog']}</value> 
      </list> 
     </property> 
     <property name="url" value="jdbc:h2:mem:product.pricing;MVCC=TRUE"/> 
     <property name="createCommonTablesOnStartup" value="false"/> 
    </bean> 

Но когда я пытаюсь запустить тест, который я получаю эту ошибку

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) 

В чем проблема?

Кроме того, когда я использовал обычный dbunit я должен был установить autoCommit для того, чтобы заставить его работать

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

(хотя я думал, что autoCommit должен быть true по умолчанию)

ответ

0

Я знаю, что это поздний ответ, но я думаю, что ваша проблема в том, что вы неправильно создали свою схему. Я вижу, что вы используете пользовательский источник данных завода, и я бы рекомендовал вам перейти на использование более стандартизированной инициализации БД, как положить это в тестовой конфигурации XML:

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

Или объявить тестовый @Configuration класс:

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

}