2016-08-17 2 views
1

Я младший студент CS, работающий над проектом MVC с использованием весны, и я совершенно новый, чтобы весной.Весенний тест с H2 в базе данных памяти обрезает все таблицы

Я установил H2 в память db и написал 2 sql-скрипта; один для заполнения db и еще один, чтобы очистить его пустым.

Насколько я знаю, практическая разница между truncate table <table name> и delete from <table name> - это таблица обрезания, поэтому она быстрее, и она также сбрасывает автоматически увеличивающиеся столбцы. Проблема заключается в том, что таблица обрезания H2 не сбрасывает автоматически увеличивающиеся столбцы. Не могли бы вы указать, где я запутался?

Я использую аннотацию SqlGroup от Spring для запуска скриптов.

@SqlGroup({ 
    @Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = 
               "classpath:populate.sql"), 
    @Sql(executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, scripts = 
                "classpath:cleanup.sql") 
}) 

Вот очистка.sql, которая должна усекать каждую таблицу.

SET FOREIGN_KEY_CHECKS=0; 

TRUNCATE TABLE `criteria`; 
TRUNCATE TABLE `job_title`; 
TRUNCATE TABLE `organization`; 
TRUNCATE TABLE `organization_teams`; 
TRUNCATE TABLE `organization_users`; 
TRUNCATE TABLE `organization_job_titles`; 
TRUNCATE TABLE `review`; 
TRUNCATE TABLE `review_evaluation`; 
TRUNCATE TABLE `team`; 
TRUNCATE TABLE `team_members`; 
TRUNCATE TABLE `user`; 
TRUNCATE TABLE `user_criteria_list`; 

SET FOREIGN_KEY_CHECKS=1; 

И populate.sql просто вставляет кучу строк в эти таблицы, не нарушая ограничений целостности.

Итак, когда я запускаю свой тестовый класс, проходит только первый метод. В остальном я получаю вещи, как это:

ссылочного нарушения ограничения целостности: "FK3MAB5XYC980PSHDJ3JJ6XNMMT: PUBLIC.ORGANIZATION_JOB_TITLES FOREIGN KEY (JOB_TITLES_ID) Литый PUBLIC.JOB_TITLE (ID) (1)"; SQL заявление: INSERT INTO organization_job_titles (organization_id, job_titles_id) VALUES (1, 1)

Я думал, что проблема возникла из авто увеличенных столбцов не сбрасываются. Поэтому я написал другой тестовый класс:

monAutoIncTest.java

@Sql(executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, scripts = 
    "classpath:truncateTable.sql") 
    public class monAutoIncTest { 
     @Autowired 
     OrganizationService organizationService; 

     @Test 
      public void h2truncate_pls() throws BaseException { 
      organizationService.add(new Organization("Doogle")); 
      Organization fetched = organizationService.getByName("Doogle"); 
      Assert.assertEquals(1, fetched.getId()); 
     } 

     @Test 
     public void h2truncate_plz() throws BaseException { 
      organizationService.add(new Organization("Zoogle")); 
      Organization fetched = organizationService.getByName("Zoogle"); 
      Assert.assertEquals(1, fetched.getId()); 
     } 
    } 

С truncateTable.sql

SET FOREIGN_KEY_CHECKS=0; 

TRUNCATE TABLE `organization`; 

SET FOREIGN_KEY_CHECKS=1; 

Когда тест выполняется, в зависимости от того метода, который запускается сначала проходит, а другой дает мне это.

java.lang.AssertionError: Ожидаемое: 1 Актуально: 2

ответ

1

Пока H2 не поддерживает эту функцию, но мы можем увидеть такие планы в their roadmap

TRUNCATE should reset the identity columns as in MySQL and MS SQL Server (and possibly other databases).

пытающимися использовать эту заявление в составе с TRUNCATE:

ALTER TABLE [table] ALTER COLUMN [column] RESTART WITH [initial value] 
+0

Это работало чудеса, благодаря кучу. – Felicyta

 Смежные вопросы

  • Нет связанных вопросов^_^