Как мне сбросить @Repository после каждого теста в SpringBootTest? - PullRequest
1 голос
/ 27 апреля 2019

Я пытаюсь собрать интеграционный тест для моего недавно созданного класса @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 для тестирования перед каждым тестом?

1 Ответ

1 голос
/ 27 апреля 2019

Я не знаю, правильный ли это подход, но я обычно просто добавляю repositoryName.deleteAll() в @Before -аннотированный метод.

@Before
public void before() {
    moduleRepository.deleteAll();
    moduleRepository.flush();
}

Этот метод будет запускаться перед каждым изваши @Test -аннотированные методы и гарантируют, что moduleRepository пуст.

Кроме того, аннотация @Transactional может быть источником вашей проблемы.Вы пробовали подход @Before без этой аннотации?Или как насчет добавления @Transactional на уровне класса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...