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

时间:2019-09-01 12:24:40

标签: java mongodb spring-boot mongobee

我有以下虚拟课程:

@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()时,它确实起作用(上面已注释)-我得到了所有物品。

你能解释为什么吗?在examples中,我看不到他们需要@Autowired

我什至应该那样做吗?我的意思是,它会破坏Mongock的锁定机制吗?

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,在我的情况下,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();
}

答案 1 :(得分:1)

没有完整的代码,很难找出问题出在哪里。很有可能没有正确配置spring配置,因此,如果没有自动装配注释,mongoTemplate将无法在Spring容器中正确实例化。如果您想更深入地了解MongoTemplate源代码并比较注释更改前后的执行路径,则将找出原因。

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