春季测试对服务交易的影响

won*_*lik 3 testing spring transactions

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

我的服务:

@Service
@Transactional(propagation = Propagation.REQUIRED)
public class ServiceImpl
Run Code Online (Sandbox Code Playgroud)

我的单元测试:

@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);
}
Run Code Online (Sandbox Code Playgroud)

因此,我天真地希望对service.add()进行两个单独的事务处理,但是除非我在测试方法上使用@nontransactional,否则它将在一个事务处理中运行(但是在测试之后它不会回滚)。

这是预期的吗?我可以通过一些配置更改它吗?

谢谢

JB *_*zet 5

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

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

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