Mongock(Mongobee)和Spring Boot在单元测试中



我有以下虚拟类:

@Document("items")
static class Item {
int i;
public Item() {
}
public Item(int i) {
this.i = i;
}
public int getI() {
return i;
}
}

这里有一个简单的@Changeset

//@Autowired
@ChangeSet(order = "001", id = "add_items", author = "tester")
public void changeset1(MongoTemplate mongoTemplate) {
for (int i = 0; i < NUM_OF_DB_ITEMS; i++) {
mongoTemplate.insert(new Item(i));
}
}

调用@Changeset后,单元测试正在运行(注意 mongoTemplate@Autowired(

@Test
public void test() {
List<Item> items = mongoTemplate.findAll(Item.class);
System.out.println(items);
}

问题:我从findAll()获得零个项目

我发现当我将@Autowired添加到changeset1()时,它确实有效(上面评论过( - 我得到了所有项目。

你能解释一下为什么吗?在示例中,我认为他们不需要@Autowired

我甚至应该这样做吗?我的意思是,它会损坏蒙戈克的锁定机制吗?

没有完整的代码,很难弄清楚出了什么问题。很可能 Spring 配置不正确,因此如果没有自动线注释,mongoTemplate 无法在 Spring 容器中正确实例化。如果您想更深入地跟踪MongoTemplate源代码并比较注释更改之前和之后的执行路径,您将找出原因。

我建议按照他们的例子找出项目中缺少的任何内容。 https://github.com/cloudyrock/mongock-samples/tree/master/samples-mongock-spring/sample-mongock-spring-v2

我遇到了同样的问题,在我的情况下,bean 创建者/运行器有一个拼写错误的包名称,用于构建器贡品"changeLogScanPackage">

@Bean
public SpringMongock springMongock(MongoTemplate mongoTemplate, Environment springEnvironment) {
return new SpringMongockBuilder(mongoTemplate, "changeLogScanPackage")
.setSpringEnvironment(springEnvironment)
.setLockQuickConfig() OR .setLockConfig(3, 4, 3) 
...other setters
.build();
}

我意识到这是一个老问题,但根据 Mongock 文档,您需要使用MongockTemplate,而不是MongoTemplate

最新更新