Springunit testing用例不会回滚插入记录

以下测试用例在function上正常工作,但其中一个必须在数据库中创建新文章的测试方法在测试用例执行结束时不会回滚。
我希望它能以这种方式运作。 对于测试用例,更新文章实际上在测试用例执行结束时回滚更新。

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(value = "/applicationContext-test.xml") @TransactionConfiguration(transactionManager = "txManager", defaultRollback = true) @Transactional public class PriceRepositoryTest { @Resource(name ="repository") private PriceRepository repository; @Test public void testGetAll() throws Exception { Assert.assertEquals(8, repository.getAll().size()); } @Test @Rollback public void shouldSaveNewArticle(){ Article article = new Article(); article.setName("Article"); article.setPrice(33); repository.save(article); Assert.assertEquals(9, repository.getAll().size()); } @Test @Rollback public void shouldUpdateArticle(){ Article article = repository.getArticle(4); article.setPrice(33); repository.update(article); Assert.assertEquals(String.valueOf(33.0), String.valueOf(repository.getArticle(4).getPrice())); } 

}

您的DAO是否也标有@Transactional ? 如果是,那就是问题:不同层上的事务性不知道您的本地事务配置。 如果repository.update(article)@Transactional ,它可能会也可能不会启动新事务(取决于propagation属性的值),但它会在执行后提交事务,并且您的测试方法无法拦截那。

这是为什么应该在服务级别而不是DAO级别启动事务的原因之一。

(如果不是这样,我谦卑地道歉)

我也遇到了这个问题,并花了几个小时试图找到根本原因。 问题是这里描述的问题的变体。 在我的例子中,应用程序通过Spring调用存储过程,其中一个过程包含一个COMMIT语句。

提交应始终由应用程序控制,如果存储过程中某处存在杂散提交,则Spring无法控制事务,测试也不会回滚。

我刚刚遇到这个问题,我的unit testing都设置为回滚,测试完成后我的记录仍然显示在数据库中。 原因是在DAO中有一个对entitymanager flush()的调用是在方法中 – 这迫使事务提交。

em.persist(jpaServer); em.flush(); //无论设置什么样的弹簧,都会提交记录

取消冲洗并确认无记录。 使用注释为@Rollback(false)的测试测试相同的代码并确认记录(certificate不需要刷新)

  • 本www.nimbits.com