我尝试使用Junit测试来覆盖我的代码并面对非常意外的情况:
先决条件:
ProductRepository
是经典的Spring Data
实施,扩展了JpaRepository
。
ProductService
是通过ProductRepository
Play! Framework
内部使用Promise
的服务。所有ProductService
方法都会返回Promise<ServiceResponse>
。
请参阅下面的Junit测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes ={SomeConfig.class})
public class ProductTest{
@Inject
private ProductService service;
@Inject
private ProductRepository repository;
@BeforeTransaction
public void beforeTransaction(){
Product p = repository.getProductById(1L);
System.out.println("Before: "+ p.isActive());
}
@AfterTransaction
public void afterTransaction(){
Product p = repository.getProductById(1L);
System.out.println("After: "+ p.isActive());
}
@Test
@Transactional
public void checkProductRepository(){
Product p = repository.getProductById(1L);
p.setActive(1);
repository.save(p);
}
@Test
@Transactional
public void checkProductService(){
service.activateById(1L).get(1000L);
}
}
结果:
之前: 0 开始交易... checkProductRepository .... 回滚交易... checkProductRepository ... 之后: 0
之前: 0 开始交易.. checkProductService .... 回滚交易... checkProductService ... 之后: 1
但是怎么可能?!
对于第二次测试,我使用ProductService
事务回滚,但它没有为active
(之后:1 )恢复状态Product
。< / p>
任何人都可以解释一下:怎么可能?以及如何解决这个问题。