@NotTransactional替代品

ian*_*ank 6 junit spring mybatis

我正在进行单元测试,它通过DAO将信息提交到Oracle数据库,然后检索它并检查所有内容是否保持不变.

测试类中还有其他单元测试,在课程顶部我有:

@TransactionConfiguration (defaultRollback = true)
Run Code Online (Sandbox Code Playgroud)

我想知道如何删除@NotTransactional.我没有在类上指定Transactional,所以默认情况下不应该像那样测试.由于这是它自己的测试,我不知道@BeforeTransaction(或After)注释是否正确.

最大的问题是,如果没有@NotTransactional,看起来好像退订()函数不跑了.(垃圾标志不变.)

再次运行测试,@ rollback = false和@NonTransactional存在,我在测试完成后在数据库中看到trash标记正确设置为true.

@RunWith (SpringJUnit4ClassRunner.class)
@TransactionConfiguration (defaultRollback = true)
public class DatabaseTest {

    @Autowired (required = true)
    private FooDao<Foo> fooDao;

    @Autowired (required = true)
    private FooService fooService;

    // other tests here that are marked @Transactional.

    @Test
    @NotTransactional
    public void testDelete() {
        Foo foo = new foo();
        foo.setTrashFlag(false);
        foo.setId(123);

        fooDao.create(foo);

        Foo fooFromDb = fooService.getFromDbById(123);
        assertNotNull(fooFromDb);

        fooService.unsubscribe(123);   // among other things, 
                                       // **sets trash flag to true.**

     // sqlSession.flushStatements();  // doesn't seem to commit the unsubscribe action


        // getFromDbById() returns ONLY Foos with trash set to false, so we expect
        // nothing returned here as we've just set trash to true, using unsubscribe().

        Foo trashedFoo = fooService.getFromDbById(123);   
        assertNull(trashedFoo);
Run Code Online (Sandbox Code Playgroud)

谢谢!

Wou*_*ter 9

我不知道这是否真的是主题,但我使用@NotTransactional来处理具有事务基类的方法.Spring说要在事务性和非事务性中拆分测试,但我发现在我的情况下,只需在方法中添加以下内容即可禁用事务并让我删除已弃用的注释:

@Transactional(propagation = Propagation.NEVER)
Run Code Online (Sandbox Code Playgroud)

我以为我只是把它放在这里,对于那些和我做同样事情的人来说.


Lio*_*orH 5

@Rollback(false)并不总是足够的,它只意味着交易不会在测试结束时回滚.但它仍然在事务中运行测试,这有时会导致与其他正在运行的事务冲突.

正如Spring建议的那样,您有两种选择:

  1. 将测试类拆分为两个,事务测试可以在测试类中注释@Transactional,而非事务测试在测试类中没有事务注释.
  2. 使用方法注释而不是类注释,使用注释每个事务测试@Transactional,但将其从类范围中删除

引用Spring 文档:

从Spring 3.0开始,@NotTransactional不赞成将非事务性测试方法移动到单独的(非事务性)测试类@BeforeTransaction@AfterTransaction方法或方法.作为使用整个类注释的替代@Transactional方法,请考虑使用以下方法注释单个方法@Transactional:这样做允许在同一测试类中混合使用事务和非事务方法,而无需使用@NotTransactional.