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)
谢谢!
我不知道这是否真的是主题,但我使用@NotTransactional来处理具有事务基类的方法.Spring说要在事务性和非事务性中拆分测试,但我发现在我的情况下,只需在方法中添加以下内容即可禁用事务并让我删除已弃用的注释:
@Transactional(propagation = Propagation.NEVER)
Run Code Online (Sandbox Code Playgroud)
我以为我只是把它放在这里,对于那些和我做同样事情的人来说.
@Rollback(false)并不总是足够的,它只意味着交易不会在测试结束时回滚.但它仍然在事务中运行测试,这有时会导致与其他正在运行的事务冲突.
正如Spring建议的那样,您有两种选择:
@Transactional,而非事务测试在测试类中没有事务注释.@Transactional,但将其从类范围中删除引用Spring 文档:
从Spring 3.0开始,
@NotTransactional不赞成将非事务性测试方法移动到单独的(非事务性)测试类@BeforeTransaction或@AfterTransaction方法或方法.作为使用整个类注释的替代@Transactional方法,请考虑使用以下方法注释单个方法@Transactional:这样做允许在同一测试类中混合使用事务和非事务方法,而无需使用@NotTransactional.
| 归档时间: |
|
| 查看次数: |
4261 次 |
| 最近记录: |