Я пытаюсь собрать интеграционный тест для моего недавно созданного класса @Repository, но мне не повезло с запуском всех тестов вместе.Если я запускаю каждый тест отдельно - они проходят, однако, если я запускаю весь тестовый класс - два теста терпят неудачу, пытаясь найти одну строку по идентификатору в H2 (отдельную базу данных для тестирования) и не найти ни одного.
Этомой тестовый класс ниже:
package com.vaidas.development.gradecalculatorbackend.repositories;
import com.vaidas.development.gradecalculatorbackend.models.Module;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
import static org.junit.Assert.assertEquals;
@RunWith(SpringRunner.class)
@SpringBootTest
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
public class ModuleRepositoryTest {
@Autowired
private ModuleRepository moduleRepository;
@Test
@Transactional
public void shouldInsertAndFindAll() {
// GIVEN
Module module = new Module("Test module", null);
int count = moduleRepository.findAll().size();
// WHEN
moduleRepository.insertModule(module);
int countAfter = moduleRepository.findAll().size();
// THEN
assertEquals(count,countAfter - 1);
}
@Test
@Transactional
public void shouldInsertAndFindOne() {
// GIVEN
Module module = new Module("Test module", null);
module = moduleRepository.insertModule(module);
// WHEN
Module storedModule = moduleRepository.findOne(module.getId());
// THEN
assertEquals(storedModule.toString(), module.toString());
}
@Test
@Transactional
public void shouldUpdate() {
// GIVEN
Module module = new Module("Test module", null);
module = moduleRepository.insertModule(module);
Module updatedModule = new Module("Test module updated", null);
updatedModule.setId(module.getId());
// WHEN
moduleRepository.updateModule(updatedModule);
// THEN
Module foundModule = moduleRepository.findOne(updatedModule.getId());
assertEquals(foundModule.getName(), updatedModule.getName());
}
@Test
@Transactional
public void shouldDelete() {
// GIVEN
Module module = new Module("Test module", null);
module = moduleRepository.insertModule(module);
// WHEN
moduleRepository.deleteModule(module);
// THEN
assertEquals(0, moduleRepository.findAll().size());
}
}
Что я пробовал:
- с использованием аннотаций @DirtiesContext и @Transactional, которые я ожидал сбросить содержимое БД
- используя аннотации @Before и @After для каждого теста, однако казалось, что они действовали асинхронно и не ожидали, пока БД завершит добавление / удаление экземпляров
Неудачные тесты:
shouldInsertAndFindOne() {
shouldUpdate() {
Каждый из вышеперечисленных выдает следующую ошибку:
org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
Может кто-нибудь объяснить, почему это произойдет и как правильно сбросить мою базу данных H2 для тестирования перед каждым тестом?