【发布时间】:2016-12-09 09:53:28
【问题描述】:
我正在寻找我测试过很多东西的所有互联网,但我找不到适用于我的代码的答案。
我想在运行测试后回滚我的数据库(或者每次测试后我并不关心)
这里是我的代码:
@Transactional
public class ApplicationServiceTest {
private ApplicationService applicationService;
@Test
public void testAddApplication() throws ExceptionMessage
{
Application application = applicationService.addApplication("nom", true, "domaineFonctionnel");
// [...] testing
}
//[...] @Before and @After doing things
}
public class ApplicationService{
private ApplicationDao applicationDao;
public Application addApplication(String nom, boolean autorise, String domaineFonctionnel)
{
Application application = new Application();
// [..] Initialise application with parameters
applicationDao.addApplication(application);
return application;
}
}
public class ApplicationDao extends Dao
{
private static EntityManagerFactory entityManagerFactory;
public void updateApplication(Application application) {
entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
entityManager.merge(application);
entityManager.getTransaction().commit();
entityManager.close();
}
}
所以从我读过的内容来看,@Transactional 默认情况下应该回滚我的事务。但事实并非如此。为什么?
(我尝试将@Transactional 添加到 dao 和服务,但它不会改变任何东西)
【问题讨论】:
-
您只能回滚您在事务中所做的任何事情,只要您不提交该事务。一旦您致电
entityManager.getTransaction().commit();,就为时已晚,无法回滚。并且 @Transactional 不会回滚您的事务。阅读文档docs.oracle.com/javaee/7/api/javax/transaction/… -
好的,那么测试我的功能的最佳方法是什么?没有在我的数据库中保留所有内容?
-
@Transactional只会在您的代码失败时触发。关键是,你不应该在测试中使用你的实际数据库,而是使用一些数据集,例如(并使用像 Jailer 这样的工具来生成一些),所以你可以运行真正的测试而不使用你的数据库 -
我建议不要回滚测试所做的更改。这可确保执行不会在回滚时发生的任何挂起的刷新。因此,您并不真正知道是否一切正常。如果您使用为每个测试创建的内存数据库(非常便宜),您应该不会有任何问题。