我正在对一个应用程序DAO运行一个简单的JUnit测试。问题是我总是得到:
javax.persistence.RollbackException: Transaction marked as rollbackOnly
字符串
JUnit测试是:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:com/my/app/context.xml"}
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)
@Transactional
public class PerformanceTest {
@Test
@Transactional(propagation= Propagation.REQUIRES_NEW)
@Rollback(false)
public void testMsisdnCreationPerformance() {
// Create a JPA entity
// Persist JPA entity
}
}
型
正如你所看到的,我清楚地声明了不回滚这个方法。
Spring JUnit支持总是将rollback设置为true吗?
8条答案
按热度按时间balp4ylt1#
它应该像你期望的那样工作,但可能是你在测试中打开了你的类中的另一个事务,或者你在某个地方有其他功能/或bug。
顺便说一句,这些注解应该足够了:
字符串
@参见Spring参考章节9.3.5.4交易管理(或当前版本)
xcitsw882#
只需添加注解Rollback并将标志设置为false。
字符串
deikduxw3#
这是奇怪的愿望测试,改变你的数据库和保持修改.测试应该是正交的:没有测试依赖于其他.此外,测试应该是独立的测试顺序,甚至idempotent .
因此,要么你想在你的
setUp()
方法中更改你的数据库,并回滚你的tearDown()
方法中的更改,要么你想设置一个测试数据库,其中有一些好的值用于测试。也许我在这里错过了一些东西,但通常你不应该想要的。
lf3rwulv4#
来自官方文档:
默认情况下,测试事务将在测试完成后自动回滚;但是,可以通过@Commit和@Rollback注解以声明方式配置事务提交和回滚行为
https://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html#integration-testing-annotations
@Commit表示事务性测试方法的事务应该在测试方法完成后提交。@Commit可以用作@Rollback(false)的直接替换,以便更明确地传达代码的意图。
svmlkihl5#
字符串
t5zmwmid6#
我同意拉尔夫的回答。
Propagation.REQUIRES_NEW创建了一个新的事务,这可能与运行测试的主事务路由不匹配。
在我的简单经验中,注解 *@ translation * 将正确地定义每个测试应该运行的事务上下文,将特定的当前Rollback子句委托给这个上下文(如Ralph所示)。
Ralph的回答是有用的,同时Snicolas的回答涉及到管理测试上下文的特定情况。idemistry是集成和自动测试的基础,但应该有不同的实现方法。问题是,你有哪种方法?这些方法有什么行为?
字符串
是简单的,问题连贯的方式:)
jqjz2hbq7#
1.在测试类级别添加
@Rollback
1.在测试方法中添加
@Transactional(value = "your_ManagerName",rollbackFor = Exception.class)
izkcnapc8#
使用类级别注解禁用自动回滚
字符串