Spring Test : 测试 dao 后回滚数据库

Posted

技术标签:

【中文标题】Spring Test : 测试 dao 后回滚数据库【英文标题】:Spring Test : Rollback the database after testing the dao 【发布时间】:2016-12-09 09:53:28 【问题描述】:

我正在寻找我测试过很多东西的所有互联网,但我找不到适用于我的代码的答案。

我想在运行测试后回滚我的数据库(或者每次测试后我并不关心)

这里是我的代码:

@Transactional
public class ApplicationServiceTest 

    private ApplicationService applicationService;

    @Test
    public void testAddApplication() throws ExceptionMessage
    
        Application application = applicationService.addApplication("nom", true, "domaineFonctionnel");

        // [...] testing    
    

    //[...] @Before and @After doing things


public class ApplicationService

    private ApplicationDao applicationDao;

    public Application addApplication(String nom, boolean autorise, String domaineFonctionnel)
    
        Application application = new Application();

        // [..] Initialise application with parameters

        applicationDao.addApplication(application);     
        return application;
    


public class ApplicationDao extends Dao


    private static EntityManagerFactory entityManagerFactory;

    public void updateApplication(Application application) 

        entityManager = entityManagerFactory.createEntityManager();

        entityManager.getTransaction().begin();
        entityManager.merge(application); 
        entityManager.getTransaction().commit();

        entityManager.close();
    

所以从我读过的内容来看,@Transactional 默认情况下应该回滚我的事务。但事实并非如此。为什么?

(我尝试将@Transactional 添加到 dao 和服务,但它不会改变任何东西)

【问题讨论】:

您只能回滚您在事务中所做的任何事情,只要您提交该事务。一旦您致电entityManager.getTransaction().commit();,就为时已晚,无法回滚。并且 @Transactional 不会回滚您的事务。阅读文档docs.oracle.com/javaee/7/api/javax/transaction/… 好的,那么测试我的功能的最佳方法是什么?没有在我的数据库中保留所有内容? @Transactional 只会在您的代码失败时触发。关键是,你不应该在测试中使用你的实际数据库,而是使用一些数据集,例如(并使用像 Jailer 这样的工具来生成一些),所以你可以运行真正的测试而不使用你的数据库 我建议不要回滚测试所做的更改。这可确保执行不会在回滚时发生的任何挂起的刷新。因此,您并不真正知道是否一切正常。如果您使用为每个测试创建的内存数据库(非常便宜),您应该不会有任何问题。 【参考方案1】:

如果您不在测试类中使用 SpringJUnit4ClassRunner 运行器,则 @Transactional 注释将被忽略。

尝试添加它:

@RunWith(SpringJUnit4ClassRunner.class)  
@Transactional
public class ApplicationServiceTest 

【讨论】:

【参考方案2】:

davidxxx 的答案是正确的。使用弹簧设置,这是标准行为。

要阅读的官方文档:

https://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html#testcontext-tx-rollback-and-commit-behavior

【讨论】:

以上是关于Spring Test : 测试 dao 后回滚数据库的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Test 自动回滚 DAO 集成测试是一种好习惯吗?

Spring 的 TestNG 回滚事务不起作用

Spring/JTA/JPA DAO 集成测试不回滚?

Laravel 测试不会在每次测试后回滚事务

Yii2 验收测试。在每次测试后回滚在验收测试中所做的所有更改

使用 Atomikos JTA 事务管理器时,Spring 单元测试不会回滚