Java单元测试:使用de.flapdoodle.embed.mongo库完成MongoDB的操作mock
单元测试第四篇,演示在单元测试时,如何对MongoDB操作进行mock,便于本地或CI/CD环境的质量测试、覆盖率测试。相关代码已经放在Github上:源代码注:该库在首次运行时,会真的去下载并搭建一个Mongo运行环境,因此:1、运行时,需要外网网络,并且质量不能太差,一个包上百兆呢(只会下载一次)2、每次运行,都需要清理旧数据,否则可能对你的测试代码造成干扰。下面简述开发过程:1、首先,还是正
单元测试第四篇,演示在单元测试时,如何对MongoDB操作进行mock,便于本地或CI/CD环境的质量测试、覆盖率测试。
相关代码已经放在Github上:源代码
注:该库在首次运行时,会真的去下载并搭建一个Mongo运行环境,因此:
1、运行时,需要外网网络,并且质量不能太差,一个包上百兆呢(只会下载一次)
2、每次运行,都需要清理旧数据,否则可能对你的测试代码造成干扰。
下面简述开发过程:
1、首先,还是正常建立项目,并有常规的MongoDB操作的业务逻辑;
2、项目添加mock库的引用,打开pom.xml,添加:
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<version>2.2.0</version>
<scope>test</scope>
</dependency>
注1:scope为test,是仅在单元测试时引入,运行时并不引入。
3、application.yml配置文件无需修改,会在代码里配置IP和端口。
注:为保险起见,建议新建unittest的配置节,把MongoDB的ip改掉,避免mock不生效,导致误发或报错
4、在单元测试代码里,启动引入的MongoDB监听:
// 定义3个mock对象
private static final MongodStarter starter = MongodStarter.getDefaultInstance();
private static MongodExecutable mongodExecutable;
private static MongodProcess mongod;
/**
* 启动mock的mongo,并指定监听端口和IP地址。
* 注意:首次启动测试,会在宿主机下载相应版本的Mongo,所以会比较慢。
*/
@BeforeAll
static void startMongo() throws Exception {
// 超过3.4的以上版本,会报错: Could not start process: <EOF>
mongodExecutable = starter.prepare(new MongodConfigBuilder()
.version(Version.Main.V3_4)
.net(new Net(12345, Network.localhostIsIPv6())).build());
mongod = mongodExecutable.start();
}
@AfterAll
static void stopMongo() {
mongod.stop();
mongodExecutable.stop();
}
5、好了,现在可以直接对项目进行测试了,所有的MongoDB操作,都会指向测试环境下载的实例。
注:再次提醒,这是真的Mongo,数据不会丢失,测试前要清理数据,比如调用:repository.deleteAll();
如果你在运行时有问题,可以下载上面的源码,进行对比,看看你的代码哪里有问题。
注:在我的实际测试过程中,发现如果引用的Mock版本超过3.4,会在运行时报错:Could not start process: <EOF>
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)