2012-03-17 10 views
0

すべてのテストを孤立して実行するには、テストメソッドが呼び出されるたびにMongoDbコレクションを削除して再作成し、POJOアノテーションを読み込みたいと思います。問題は、MongoTemplateクラスがインスタンス化されたときにのみインデックスが作成されるように見えるということです。すべてのインデックスを持つコレクションを再作成するにはどうすればよいですか?

これが「通常」のアプリケーションに最適ですが、統合テスト中に、私は(実際のアプリケーションのために多分遅すぎる...)このようなテストを持っているしたいと思います:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = { 
    ApplicationConfig.class, 
    MongoConfiguration.class, 
    TestMongoConfiguration.class}) 
@ActiveProfiles("test") 
public class BookServiceIntegrationTests { 
    private @Autowired TestHelper testHelper; 

    @Before 
    public void startup() { 
     testHelper.init(Book.class); 
    } 

    @After 
    public void cleanup() { 
     testHelper.drop(Book.class); 
    } 

    //test methods... 
} 

そして、これがあります私の非常に簡単POJOクラス:私はクラスMongoPersistentEntityIndexCreatorは、POJOの注釈を読み、colletionのインデックスを確保していることがわかりましたMongoDBのための春のデータ(1.0.1.RELEASE)のソースをチェック

@Document(collection = "books") 
public class Book { 
    @Id 
    private ObjectId id; 

    @Indexed(unique = true) 
    private String isbn; 

    private String author; 
    private String title; 
    private String genre; 

    private List<String> tags; 
    private List<Comment> comments; 
} 

。このクラスは、MongoTemplateコンストラクタ内でのみ呼び出されます。

私はテストでロールバックされたトランザクションのようなものをシミュレートするより良い方法があると思いますか?

おかげで、私はあなたが注釈を読みたい見ることができるので カルロ

答えて

0

編集ので、次にくるものが既に試したものになるかもしれません。 Javaの外部でコレクションをスクリプティングする場合は、この方法を試してみてください。

Javaのシステムランタイムexecを使用してmongodumpとmongorestoreを使用してください。

まず、テストコレクションのスナップショットを撮る:

/usr/bin/mongodump -d yourDB -c books 

次に、あなたのJUnitテストのセットアップでは、コレクションを復元、--dropオプションで最初に古いものを落とします。

/usr/bin/mongorestore --drop -d yourDB -c books dump/yourDB 

これは、インデックスを同時に復元する必要があります。

+0

ありがとうございました。これは、テストスイートを実行する前にテストデータを読み込むという2番目のステップになります。これらのコマンドを私のgradleスクリプトに追加しようとします。 –

関連する問題