我使用@Transactional我的JUnit测试(主要优势是一个测试中改变的回滚),但我有个小问题,这影响我的服务交易。因此,例如这是春季测试inpact上服务交易
我的服务:
@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()两个独立的交易记录,但除非我用@它在一个事务内部运行的测试方法上是非事务性的(但在测试之后它不会回滚)。
这是预期吗?我可以通过一些配置改变它吗?
谢谢
从测试方法中删除@Transactional不会回退事务:测试不会有任何事务。事务将在服务方法被调用时开始,并在服务方法返回时提交。 –
真实,笨拙的表述。删除@Transactional注释将会阻止事务管理器在java层创建一个事务。但是,大多数数据库将始终为每个会话创建一个隐式事务,并且如果将自动提交设置为关闭(默认为IIRC),则没有事务的行为与始终回滚的事务的行为相同。如果我错了,请纠正我。 – pap
错误,没有。从* test *方法中移除Transactional将使测试在任何事务上下文之外运行,但Spring将仍然为每个服务方法调用启动事务,因为* service *方法使用Transactional注释。由服务完成的实际事务工作(可能更新某个数据库)将在事务中完成并提交,除非服务本身抛出运行时异常。 –