Spring 测试对服务事务的影响

标签 spring testing transactions

我在我的 JUnit 测试中使用@Transactional(主要优点是在一个测试中回滚更改)但是我有一个小问题,这会影响我的服务事务。例如,这是

我的服务:

@Service
@Transactional(propagation = Propagation.REQUIRED)
public class ServiceImpl

我的单元测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/test-context.xml" })
@Transactional
public class TestService 

@Test
public void testNumberTransaction() {
Entity a = new Entity();
Entity b = new Entity();
service.add(a);
service.add(b);
}

我天真地希望 service.add() 有两个单独的事务,但除非我在测试方法上使用 @nontransactional 它在一个事务中运行(但它在测试后不会回滚)。

这是预期的吗?我可以用一些配置来改变它吗?

谢谢

最佳答案

是的,这是预期的。 Propagation.REQUIRED(这是默认设置)表示:如果存在,则在现有事务中执行。否则,创建一个事务并在方法结束时提交它。

所以是的,如果整个测试方法是事务性的,那么两个服务调用都将在测试事务的上下文中执行。

请注意,由于该服务带有 REQUIRED 注释,因此如果事务已经存在,它应该可以工作。这使得测试有效:它在现有事务的上下文中测试您的服务。如果您希望服务在其自己的专用事务中执行,则应使用 REQUIRES_NEW 进行注释。但是当然,如​​果是这种情况,您将无法通过在事务中执行测试来回滚服务事务。

关于Spring 测试对服务事务的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7146182/

相关文章:

perl - 使用 Test::Mojo 测试 URL 生成

c++ - 非模板类的显式类实例化

java - @Transactional 和继承

database - 使用 SQLAlchemy session 和事务

php - 是什么导致 mySQL 中出现回滚失败错误?

java - 如何使 spring boot 嵌入式 tomcat 为基本 url 返回 200 OK?

Java Jdbc 事务

java - 如果 pom.xml 文件有错误,创建 Maven 项目时可能会出现什么问题

java - 如何将Spring war文件部署到Tomcat?

python - 从父类继承单元测试