【问题标题】:How can I recreate a collection with all the indexes?如何重新创建包含所有索引的集合?
【发布时间】:2012-03-17 13:25:33
【问题描述】:

为了单独运行我的所有测试,我想在每次调用测试方法时删除并重新创建一个 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;
}

检查 Spring Data for MongoDB (1.0.1.RELEASE) 的源我看到 MongoPersistentEntityIndexCreator 类正在读取 POJO 注释并确保集合的索引。此类仅在 MongoTemplate 构造函数内部调用。

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

谢谢, 卡罗

【问题讨论】:

    标签: mongodb integration-testing spring-data


    【解决方案1】:

    编辑因为我可以看到你想阅读注释,所以接下来的内容可能是你已经尝试过的。如果您可以在 Java 之外为集合编写脚本,则可以尝试这种方法:

    使用来自 Java 的系统运行时 exec 使用 mongodump 和 mongorestore。

    首先,给你的测试集合拍一张快照:

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

    然后在您的 JUnit 测试设置中,恢复集合,首先使用 --drop 选项删除旧集合。

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

    这应该同时恢复索引。

    【讨论】:

    • 谢谢。这将是第二步:在执行测试套件之前加载测试数据。我会尝试将这些命令添加到我的 gradle 脚本中。
    猜你喜欢
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    相关资源
    最近更新 更多