【问题标题】:How not to rollback @DataJpaTest?如何不回滚@DataJpaTest?
【发布时间】:2020-06-07 07:40:21
【问题描述】:

在下面的代码中

@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 而不是在测试中回滚事务?

【问题讨论】:

  • 顺便说一句,不确定您是否知道-您也可以接受答案-这可以帮助人们过滤掉已接受答案的问题(并奖励帮助的人)。 .) (stackoverflow.com/help/someone-answers)
  • (当然——只有当答案确实解决了问题时才接受答案。)
  • 感谢您的问题,我找到了如何将 DBRider @ExpectedDataset 与 DataJpaTest 一起使用的解决方案。在测试方法之后我遇到事务回滚问题,因此我在 db 中没有任何变化来与预期结果进行比较。 @Transactional(propagation = Propagation.NOT_SUPPORTED) 帮助我解决我的问题。

标签: spring-data spring-boot-test


【解决方案1】:

您的TestEntityManager 是自动连接的,但您正在事务之外执行persist 调用。

你可以自动绑定TransactionTemplate:

    @Autowired
    private TransactionTemplate transactionTemplate;

并使用其execute 方法执行您的数据库交互:

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

您还应该知道,现在您负责在测试执行后清理测试数据库(随着逻辑的增长,这可能难以维护):

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

【讨论】:

    猜你喜欢
    • 2022-12-29
    • 2020-04-03
    • 2019-08-16
    • 2019-03-12
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多