2016-08-25 18 views
3

私はJPAリポジトリのいくつかの機能をテストするテストクラスを持っています。私のJPAリポジトリはH2 dbに接続されています。私はテストエンタイトでdbを生成したいのですが、すべてのテストの前に、これは私のテストクラスです:junitのセットアップ方法を一度だけ実行する

public class EntityRepositoryTest { 

    @Autowired 
    EntityJPARepository EntityRepo; 

    Entity entity; 

    @Before 
    public void setup(){ 
     entiti = //initializes entity with values 
     EntityRepo.save(entiti); 
    }  

    //some tests on repo 

} 

問題は@Before annotiationは、すべてのテストメソッドの前にそれを呼び出すことである、と私はsaveは前にすべての呼び出されますので、私のエンティティオブジェクトは、H2デシベル(に複製したくありませんメソッド)、私も@BeforeClassの注釈で行うことができないので、私はメソッドを@autowiredリポジトリに呼び出す必要があります。リポジトリがautowiredになった後にすべてのテストを行う前に一度だけセットアップを呼び出すにはどうすればよいですか?

+0

各テストのデータの整合性を保証するには、各テストの完了後にロールバックされるトランザクションで実行する必要があります。 @Beforeは同じトランザクションで実行されるため、次のテストが実行される前に、挿入されたすべての挿入がロールバックされます。参照:http://stackoverflow.com/questions/17308335/before-and-transactional。これに対処するためのコードを書く必要はありません。 –

+0

@transactionalアノテーションを追加すると、私の問題も解決します。ありがとうございます! –

答えて

3

あなたは@Beforeメソッドを使用することができ、あなただけやってチェックするのビットを必要とする:

public class EntityRepositoryTest { 

    @Autowired 
    EntityJPARepository EntityRepo; 

    Entity entity; 

    @Before 
    public void setup() { 
     if (entity == null) { // true only for first pass 
      entity = //initializes entity with values 
      EntityRepo.save(entity); 
     } 
    }  

    //some tests on repo 

} 

また、あなたはエンティティを削除@Afterメソッドを追加することができます。

+1

私は各テストの後にリポジトリからすべてのデータを削除することができないのは私には分かりません。その最も簡単な解決法とおそらく最高の解決策です。ありがとう! –

+0

Springを使用している場合( '@ Autowired'アノテーションで示されているように)、[spring-test-dbunit](https://springtestdbunit.github.io/spring-test-dbunit/)を見てください。あるいは、XMLがあなたのものでなく、Java DSLをより良くしたい場合は、[DbSetup](http://dbsetup.ninja-squad.com/)を試してください。どのような場合でも、テストを設定する際に自分のコードに依存することではありません。 –

1

注釈を使用することができます private static boolean initialized = false;

@BeforeClass 
    public static void init() { 
    initialized = true; 
    } 

は、静的な初期化の場合と同じです。そこにすべての初期化を定義する必要があります。それはなぜあなたのためではないのですか?

メソッドが実行されたかどうかを静的フラグで保存できます。

+0

フラグを設定することはこの問題を解決する方法ですが、私は、フラグ設定で間違っている必要のない別のよりクリーンな方法があることを願っています –

+0

異なるファイルのユニットテストは互いに独立している必要があります。私の経験から、1つのファイルのテストは、しばしば特定の初期化に依存しています。 beforeとbeforeclassはexcatly使われる概念です。 –

+0

私は同意します:テストクラスごとに "once"を実行するためのJUnitの概念は@BeforecClassと呼ばれます。他の解決方法は、「推奨された方法」を無視することです。なぜ誰かがこの答えを下降させるのか分かりません。 – GhostCat

関連する問題