如何使用所有索引重新创建集合?

时间:2012-03-17 13:25:34

标签: mongodb integration-testing spring-data

要单独运行我的所有测试,我想在每次调用测试方法时删除并重新创建一个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的Spring数据源(1.0.1.RELEASE)我看到MongoPersistentEntityIndexCreator类正在读取POJO注释并确保收集的索引。只在MongoTemplate构造函数中调用此类。

您认为我能在我的测试中找到更好的方法来模拟回滚事务吗?

谢谢, 卡罗

1 个答案:

答案 0 :(得分: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 

这应该同时恢复索引。