2013-03-18 51 views
4

我正在进行单元测试,它通过DAO向Oracle数据库提交信息,然后检索它并检查一切是否未更改。@NotTransactional alternatives

有在测试类中其他的单元测试,并在类的顶部,我有:

@TransactionConfiguration (defaultRollback = true) 

我想知道我怎么能删除@NotTransactional。我没有在类中指定Transactional,所以默认情况下没有测试应该是这样的。由于这是自己的测试,我不知道@BeforeTransaction(或After)注释是否正确。

最大的问题是没有@NotTransactional,它看起来好像unsubscribe()函数没有运行。 (垃圾标志未更改)

再次运行测试,使用@ rollback = false和@NonTransactional,我在数据库中看到垃圾标志正确设置为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); 

谢谢!

+0

您应该可以阅读您在同一交易中写下的任何记录。 – Marvo 2013-03-18 23:18:08

+0

我同意。我仍然无法确定为什么它不会在测试方法上没有执行@NotTransactional。 – iank 2013-03-19 15:55:16

+0

我承认我从来没有听说过NotTransactional,直到你的问题。你能否展示你的一个测试并解释你期望发生的事情?如果我需要访问Hibernate对象上的子记录,我只需将@Transactional放在我的测试中,这对我很有用。 – Marvo 2013-03-19 18:46:40

回答

3

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

在Spring建议,你有两个选择:

  1. 斯普利特测试类一分为二,交易测试可以与@Transactional注解测试类是一个,而在测试类中的非事务性测试,而不交易注释。
  2. 使用方法注释而不是类注释,注释每个事务测试与@Transactional,但是从类范围

引用弹簧documentation移除:

在Spring 3.0,@NotTransactional在已弃用有利于将非交易测试方法移动到单独的(非交易型) 测试类别或@BeforeTransaction@AfterTransaction方法。作为 可以使用@Transactional, 注释整个类的替代方案,请考虑使用@Transactional注释单个方法;这样做 允许在相同的测试类中混合使用事务性和非事务性方法,而无需使用@NotTransactional

7

我不知道这是否真的在主题上,但我使用了@NotTransactional来处理具有事务基类的方法。春说分裂的事务性和非事务性的测试,但我发现,在我的情况下,只需添加以下的方法只是残疾人事务,让我删除过时的注释:

@Transactional(propagation = Propagation.NEVER) 

我以为我只是把它放在这里是为了那些和我一样的事情而奔跑的人。