Я младший студент 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
Это работало чудеса, благодаря кучу. – Felicyta