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クラスです。

@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;
}

MongoDB(1.0.1.RELEASE)のSpring Dataのソースを確認するクラスMongoPersistentEntityIndexCreatorがPOJOアノテーションを読み取り、コレクションのインデックスを確認していることを確認しました。このクラスは、MongoTemplateコンストラクター内でのみ呼び出されます。

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

ありがとう、カルロ

4

1 に答える 1

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 

これにより、インデックスが同時に復元されます。

于 2012-03-17T14:38:09.780 に答える