2016-12-09 103 views
0

我正在尋找所有的互聯網我已經測試了很多東西,但我找不到在我的代碼上工作的答案。春季測試:在測試dao後回滾數據庫

我想運行測試(或每個測試後,我並不真正關心)

對於這裏的那一刻之後回滾我的數據庫是我的代碼:

@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和服務,但它不會改變任何東西),如果你沒有在你的測試類使用SpringJUnit4ClassRunner亞軍

+0

你只能你回滾事務內部做了什麼,只要你**不**提交事務。一旦你調用'entityManager.getTransaction()。commit();'爲時已晚回滾。而@Transactional不會回滾你的交易。閱讀文檔http://docs.oracle.com/javaee/7/api/javax/transaction/Transactional.html – XtremeBaumer

+0

好的,那麼測試我的功能的最佳方法是什麼?不要在我的數據庫上保持一貫? –

+0

只有在代碼失敗時纔會觸發'@ Transactional'。關鍵是,你不應該在測試中使用你的實際數據庫,並且通過例子使用一些數據集(並且使用一些像Jailer這樣的工具來生成一些),所以你可以運行真正的測試並且不使用你的數據庫 – DamCx

回答

2

,該@Transactional註釋被忽略。

嘗試把它加:

@RunWith(SpringJUnit4ClassRunner.class) 
@Transactional 
public class ApplicationServiceTest {