java 事务回滚在JUnit 5的@Nested类中的测试用例中不起作用

pbpqsu0x  于 2022-12-10  发布在  Java
关注(0)|答案(4)|浏览(171)

我用的是Spring BootJUnit5 Mybatis

@SpringJUnitJupiterConfig(classes = {RepositoryTestConfig.class})
@MapperScan
@Rollback
@Transactional
public class TestClass {
    @Autowired
    private TestMapper testMapper;

    @BeforeEach
    void init() {
        User user = new User();
        testMapper.insert(user);    
    }

    @Test
    public void test1() {
        // (1) success rollback
    }

    @Nested
    class WhenExistData {
        @Test
        public void test2() {
            // (2) rollback not working
        }   
    }
}

(1)正在进行回滚。输出如下日志。

2017-05-26 22:21:29 [INFO ](TransactionContext.java:136) Rolled back transaction for test context ...

但是,(2)不起作用。我希望能够回滚到@Nested

pb3s4cty

pb3s4cty1#

这是可以预料的:* SpringTestContext框架 * 从未支持嵌套测试类的“继承”。
因此,你的“变通方法”实际上是在这个时间点上实现你的目标的正确方法。
但是,请注意,我可能会结合SPR-15366nested 测试类添加对“伪继承”的支持。
此致!
Sam(* Spring测试上下文框架的作者 *)

vfh0ocws

vfh0ocws2#

我用下面的方法解决了这个问题。

@SpringJUnitJupiterConfig(classes = {RepositoryTestConfig.class})
@MapperScan
@Rollback
@Transactional
public class TestClass {
    @Autowired
    private TestMapper testMapper;

    @BeforeEach
    void init() {
        User user = new User();
        testMapper.insert(user);    
    }

    @Nested
    @SpringJUnitJupiterConfig(classes = {RepositoryTestConfig.class})
    @MapperScan
    @Rollback
    @Transactional
    class WhenExistData {
        @Test
        public void test2() {
        }   
    }
}
643ylb08

643ylb083#

我用下面的方法解决了这个问题

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.test.annotation.Rollback;
import org.springframework.transaction.annotation.Transactional;

// JUnit5
@SpringBootTest
public class TestClass {

    @Resource
    private TestMapper testMapper;

    @Test
    @Rollback
    @Transactional
    public void createByTimerId() {
        Assertions.assertEquals(1, testMapper.insert());
    }
}
hzbexzde

hzbexzde4#

在封闭类上使用Spring中的注解NestedTestConfiguration对我来说很有用。

@NestedTestConfiguration(NestedTestConfiguration.EnclosingConfiguration.INHERIT)

因此,在您的TestClass上,您可能会有目前的注解,然后:

@NestedTestConfiguration(NestedTestConfiguration.EnclosingConfiguration.INHERIT)
public class TestClass {
...

相关问题