我在我的 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/