Как не откатить @DataJpaTest? - PullRequest
       7

Как не откатить @DataJpaTest?

0 голосов
/ 23 февраля 2020

В следующем коде

@DataJpaTest
@Transactional(propagation = Propagation.NOT_SUPPORTED)
@AutoConfigureTestDatabase(replace= AutoConfigureTestDatabase.Replace.NONE)
public class GenreDaoJpaTest{
    @Autowired
    private TestEntityManager entityManager;
    @Autowired
    private GenreRepository dao;
    ....   
}

, когда я добавляю @Transactional(propagation = Propagation.NOT_SUPPORTED) с целью отмены отката после каждого теста, я получаю исключение:

ava.lang.IllegalStateException: No transactional EntityManager found

    at org.springframework.util.Assert.state(Assert.java:73)
    at org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager.getEntityManager(TestEntityManager.java:237)
    at org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager.persist(TestEntityManager.java:92)
    at ru.otus.ea.dao.GenreDaoJpaTest.init(GenreDaoJpaTest.java:38)

Есть ли способ автопровода TestEntityManager и не отката транзакций в тестах?

1 Ответ

1 голос
/ 24 февраля 2020

Ваш TestEntityManager подключен автоматически, но вы выполняете вызов persist вне транзакции.

Вы можете автоматически подключать TransactionTemplate:

    @Autowired
    private TransactionTemplate transactionTemplate;

и выполнять взаимодействие с БД, используя метод execute:

    User savedUser = transactionTemplate.execute((conn) -> {
        return testEntityManager.persist(new User("foo"));
    });

Также вы должны знать, что сейчас Вы несете ответственность за очистку тестовой БД после выполнения тестов (что может быть трудно поддерживать по мере увеличения logi c):

    @BeforeEach // just to be sure
    @AfterEach
    public void cleanup() {
        userRepository.deleteAll();
    }
...