Установка юнит-теста Spring boot h2 запускает скрипт импорта дважды - PullRequest
0 голосов
/ 07 декабря 2018

Ниже приведен мой тестовый файл для моего класса DAO:

@RunWith(SpringJUnit4ClassRunner.class)
@ComponentScan(basePackages = {"com.foo.bu"})
@ContextConfiguration(
        locations = "/META-INF/test-config.xml")
@SpringBootTest(classes={MyDao.class})
@Transactional
public class MyDaoTest {

    @Autowired MyDao myDao;

    @Test
    public void getAllDataSet() {
        List<ProductEntity> list = myDao.getAllData();
        System.out.println(list.size());
    }
}

В то время как test-config.xml выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:tx="http://www.springframework.org/schema/tx"
   xsi:schemaLocation="
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
      http://www.springframework.org/schema/tx 
      http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

   <bean id="workflowhost" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <property name="packagesToScan">
      <array>
              <value>com.foo.bu.dao</value>
              <value>com.foo.bu.entity</value>
         </array>
      </property>
      <property name="jpaVendorAdapter">
         <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
      </property>
      <property name="jpaProperties">
         <props>
            <prop key="hibernate.hbm2ddl.auto">none</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.use_sql_comments">true</prop>
         </props>
      </property>
   </bean>

   <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="org.h2.Driver" />
      <property name="url" value="jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=TRUE;DB_CLOSE_DELAY=10;INIT=RUNSCRIPT FROM 'src/test/resources/data.sql'" />
      <property name="username" value="" />
      <property name="password" value="" />
   </bean>  

   <bean id="JpaTxnManager_workflowhost" class="org.springframework.orm.jpa.JpaTransactionManager">
      <property name="entityManagerFactory" ref="workflowhost" />
   </bean>
   <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
   <tx:annotation-driven  transaction-manager="JpaTxnManager_workflowhost"/>

   <bean id="persistenceExceptionTranslationPostProcessor"
      class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

</beans>

Мой data.sql в основном содержит скрипт sql, которыйсоздает кучу таблиц, а также вставляет фиктивные записи в таблицы.

Когда я запускаю свой тестовый файл, я получаю исключение, связанное с "Уникальным нарушением индекса или первичного ключа" для сценария SQL, который пытается вставитьзаписей.Это может произойти только в том случае, если скрипт выполняется дважды.Я не уверен, почему это происходит.Я обошел эту проблему для своего скрипта CREATE TABLE, добавив пункт CREATE TABLE IF NOT EXISTS

Я прошел документ https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html, в котором говорится о настройке hibernate.hbm2ddl.auto:none, если мы не хотим, чтобы Hibernate создавалсхемы.Я также отключил это.

Может кто-нибудь помочь мне понять, почему скрипт запускается дважды?

...