Должен ли я использовать @Transactional или @Rollback для тестовых классов DAO? - PullRequest
1 голос
/ 02 мая 2019

У меня есть слой дао для моей базы данных.Сейчас я пишу несколько интеграционных тестов для него.Интересно, следует ли использовать @ Transactional или @ Rollback в тестовом классе, так как они оба возвращают изменения в базу данных.Какой из них будет хорошей практикой и в каких условиях ?

Я пытался использовать их оба, и они оба работают в моем случае.В моем классе есть аннотированный метод @Before.

@RunWith(SpringRunner.class)
@AutoConfigureTestDatabase(replace = NONE)
@DataJpaTest
// @Transactional or @Rollback?
public class TestDao {

    @Autowired
    private ConcreteDao concreteDao;

    @Before
    public void cleanUp(){ . . . }

    @Test
    public void testSaveAllEntries(){ . . . }

    // and other tests
}

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Запуск тестов с базами данных обычно выполняется с помощью интеграционных тестов.Для простоты вы можете установить h2 с нужным вам диалектом.Подготовьте структуры базы данных и выполните необходимые сервисные вызовы.Утвердите ожидаемые результаты и пометьте метод теста как контекст грязи (как аннотацию), или перезагрузите базу данных при каждом тесте, иначе сохраненные результаты теста могут повлиять на другой тест.Таким образом, вы также можете протестировать обработку транзакций ваших сервисов.

Добавление транзакций в ваши тесты изменит ваше поведение вашей бизнес-логики.не пускайте их в свои тесты.

0 голосов
/ 02 мая 2019

согласен с @michael. Не делайте ваши тесты @transactional вообще (кроме вашего сервисного уровня). Это означает, что все ваши методы сервисного уровня / уровня персистентности, вызываемые через тесты, будут запускать свои собственные транзакции (вы сделали их транзакционными, Вы?) и сбросить изменения при коммите. Таким образом, вы гарантированно заметите, если что-то взорвется при сбросе, и вполне возможно, что через некоторое время база данных будет заполнена данными ненужных тестов

...