2016-12-09 5 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(); 
    } 
} 

I @Transactionalはデフォルトで私のトランザクションをロールバックすべきです。しかし、それはしません。どうして?

(私はDAOとサービスする@Transactionalを追加しようとしましたが、それは何も変更されません)

+0

にあなただけの限り、あなたは** **トランザクションをコミットしていないとして、あなたがトランザクション内でやったものは何でもロールバックすることができます。一旦あなたは'entityManager.getTransaction().commit(); 'を呼び出すとロールバックするのが遅すぎます。 @Transactionalはトランザクションをロールバックしません。 docs http://docs.oracle.com/javaee/7/api/javax/transaction/Transactional.html – XtremeBaumer

+0

を参照してください。さて、私の好みをテストする最良の方法は何でしょうか?私のデータベースに永遠に残っていない? –

+0

'@ Transactional'はあなたのコードに失敗した場合にだけトリガされます。ポイントは、テストで実際のデータベースを使用してはならないし、いくつかのデータセットを使用するべきである(とJailerのようないくつかのツールを使用していくつかを生成する)ので、実際のテストを実行してデータベースを使用しないでください。 – DamCx

答えて

2

あなたのテストクラスでSpringJUnit4ClassRunnerランナーを使用しない場合は、@Transactional注釈は無視されます。

@RunWith(SpringJUnit4ClassRunner.class) 
@Transactional 
public class ApplicationServiceTest { 
関連する問題