Java JUnit测试总是回滚事务
我正在对应用程序DAO运行一个简单的JUnit测试。问题是我总是得到:Java JUnit测试总是回滚事务,java,spring,junit4,Java,Spring,Junit4,我正在对应用程序DAO运行一个简单的JUnit测试。问题是我总是得到: javax.persistence.RollbackException: Transaction marked as rollbackOnly JUnit测试是: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:com/my/app/context.xml"} @TransactionConfigur
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?希望测试更改数据库并保留修改是很奇怪的。 测试应该是正交的:没有测试依赖于其他测试。 此外,测试应该独立于测试顺序,甚至是 因此,要么您想更改
setUp()
方法中的数据库,然后回滚tearDown()
方法中的更改,要么您想为测试设置一个包含一些良好值的测试数据库
也许我在这里遗漏了一些东西,但通常你不应该想要它。它应该像你期望的那样工作,但可能是你在测试中的类中打开了另一个事务,或者你在某个地方有其他特性/或bug 顺便说一句,此注释应为:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:com/my/app/context.xml"}
@Transactional
public class PerformanceTest {
@Test
@Rollback(false)
public void testMsisdnCreationPerformance() {
// Create a JPA entity
// Persist JPA entity
}
}
@见我同意拉尔夫的回答 传播.REQUIRES\u NEW创建一个新事务,这可能与运行测试的主要事务路由不匹配 根据我的简单经验,注释@Transactional将正确地定义每个测试应该在其中运行的事务上下文,将特定的current Rollback子句委托给这个上下文(如Ralph所示) 拉尔夫的答案是有用的,同时斯尼科拉斯的答案涉及管理测试上下文的一个特殊案例。 幂等性是集成和自动测试的基础,但应该是实现它们的不同方法。 问题是,你有哪种方法?这些方法有什么行为
[...]
@Transactional
public class Test {
@Test
@Rollback(false)
public void test() {
[...]
是一种简单、问题连贯的方法:)只需添加注释回滚并将标志设置为false
@Test
@Rollback(false)
从正式文件: 默认情况下,测试事务将在之后自动回滚 完成测试;但是,事务性提交和回滚 可以通过@Commit和@Rollback声明性地配置行为 注释 @Commit表示事务测试方法的事务 应在测试方法完成后提交@承诺可以 用作@Rollback(false)的直接替换,以获得更多 明确传达代码的意图
@Rollback
@Transactional(value=“your_ManagerName”,rollboor=Exception.class)
你从哪里得到例外?你能发布stacktrace吗?但这不是问题。我有一个很好的理由不回滚junit测试。所以“正确答案”并不是说你不应该这么做。正确的答案是能够解释如何添加数据的人。请您添加一些注释,说明如何在setup方法中添加数据,仍然可以在测试代码中的任何位置看到数据,然后将其回滚?不回答问题。有时,您会出于各种目的使用junit功能。如果有人问我想在junit中提交,请给出答案,然后说如果它是真的junit(可重复测试),这可能不是最佳实践。@SeanPatrickFloyd提示是REQUIRED_NEW,这表明他显然试图在执行集成测试之前设置特定的db状态。因此,它需要在测试的act部分之前保持。所以,是的,我认为我们应该坚持回答这个问题。让我非常困惑的是,即使异常一直冒泡,测试也会提交txn,而通常情况下(@Transactional on business class,而不是on test method),这会触发txn回滚。只适用于检查过的异常。未选中的将自动回滚。
I use Junit5, both commit and rollback(false) works with me.
@ExtendWith(SpringExtension.class)
@SpringBootTest
@Transactional
public class MyIntegrationTest {
@Test
@DisplayName("Spring Boot Will Rollback Data, " +
"Can Disable it By Add @Commit Or @Rollback(false) Annotation")
//@Commit
//@Rollback(false)
public void test() throws Exception {
//your test codes here...
}