坚持最高

通过引用开始使用Spring Data JPA学习Spring Data JPA课程:

1188金宝搏亚洲

1.概述

在本教程中,我们将学习如何使用Flapdoodle的嵌入式MongoDB解决方案与Spring Boot一起平稳运行MongoDB集成测试。

MongoDB是一个流行的NoSQL文档数据库。由于高可伸缩性,内置分片和优秀的社区支持,它通常被认为是“NoSQL存储”被许多开发人员所采用。

和其他持久性技术一样,能够轻松地测试数据库与应用程序其余部分的集成是至关重要的。幸运的是,Spring Boot允许我们轻松地编写这种测试。

2.Maven的依赖关系

首先,让我们为Boot项目设置Maven父类。

多亏了父母我们不需要为每个Maven依赖项手动定义版本

我们会很自然地使用Spring Boot:

<父> < groupId > org.springframework。启动< / groupId > < artifactId > spring-boot-starter-parent < / artifactId > <版本> 2.3.3。RELEASE   

您可以找到最新的Boot版本在这里

因为我们添加了Spring Boot父类,所以我们可以添加所需的依赖项,而不需要指定它们的版本:

<依赖> < groupId > org.springframework。启动< / groupId > < artifactId > spring-boot-starter-data-mongodb < / artifactId > < / >的依赖

spring-boot-starter-data-mongodb将启用Spring支持MongoDB:

<依赖> < groupId > de.flapdoodle。嵌入< / groupId > < artifactId > de.flapdoodle.embed。mongo < / artifactId > < >范围测试范围< / > < / >的依赖

de.flapdoodle.embed.mongo为集成测试提供嵌入式MongoDB。

3.使用嵌入式MongoDB测试

本节包括两个场景:Spring Boot测试和手动测试。

3.1。弹簧引导测试

后添加de.flapdoodle.embed.mongo依赖Spring Boot将自动尝试下载并启动嵌入的MongoDB当运行测试。

每个版本只下载一次软件包,以便后续测试运行得更快。

在这个阶段,我们应该能够启动并通过示例junit5集成测试:

@DataMongoTest @ExtendWith (SpringExtension.class)公共类MongoDbSpringIntegrationTest {@DisplayName(“给定对象保存”+“当保存对象使用MongoDB模板”+“然后保存对象”)@Test公共空白测试(@ autowired MongoTemplate MongoTemplate){/ /鉴于DBObject objectToSave = BasicDBObjectBuilder.start()阀门(“关键”,“价值”). get ();/ /当mongoTemplate。保存(objectToSave,“收集”);// then assertThat(mongoTemplate.findAll(DBObject.class, "collection")).extract ("key") .containsOnly("value");}}

正如我们所看到的,嵌入式数据库是由Spring自动启动的,它也应该记录在控制台中:

…Starting MongodbExampleApplicationTests on arroyo with PID 10413…

3.2。手动配置测试

Spring Boot将自动启动并配置嵌入式数据库,然后注入MongoTemplate实例。然而,有时我们可能需要手动配置嵌入式Mongo数据库(例如,当测试一个特定的DB版本时)。

下面的代码片段展示了如何手动配置嵌入式MongoDB实例。这大致相当于上一次Spring测试:

class ManualEmbeddedMongoDbIntegrationTest {private static final String CONNECTION_STRING = "mongodb://%s:%d";私人MongodExecutable MongodExecutable;私人MongoTemplate MongoTemplate;@AfterEach void clean() {mongodExecutable.stop();} @BeforeEach void setup() throws Exception {String ip = "localhost";Int port = 27017;ongodconfig mongodConfig = new MongodConfigBuilder().version(Version.Main.PRODUCTION) .net(new Net(ip, port, Network.localhostIsIPv6())) .build();MongodStarter = MongodStarter. getdefaultinstance ();mongodExecutable = starter.prepare (mongodConfig);mongodExecutable.start (); mongoTemplate = new MongoTemplate(MongoClients.create(String.format(CONNECTION_STRING, ip, port)), "test"); } @DisplayName("given object to save" + " when save object using MongoDB template" + " then object is saved") @Test void test() throws Exception { // given DBObject objectToSave = BasicDBObjectBuilder.start() .add("key", "value") .get(); // when mongoTemplate.save(objectToSave, "collection"); // then assertThat(mongoTemplate.findAll(DBObject.class, "collection")).extracting("key") .containsOnly("value"); } }

注意,我们可以快速创建MongoTemplate配置为使用我们手动配置的嵌入式数据库的bean,并在Spring容器中注册它,只需创建一个@TestConfiguration@ bean方法,将返回新MongoTemplate (MongoClients。创建(connectionString,“测试”)

更多的例子可以在官方的Flapdoodle上找到GitHub库

3.3。日志记录

我们可以在运行集成测试时通过添加这两个属性来配置MongoDB的日志消息src /测试/资源/ application.propertes文件:

logging.level.org.springframework.boot.autoconfigure.mongo.embedded logging.level.org.mongodb

例如,要禁用日志记录,只需将值设置为:

logging.level.org.springframework.boot.autoconfigure.mongo.embedded =从logging.level.org.mongodb =

3.4。在生产环境中使用真实数据库

因为我们添加de.flapdoodle.embed.mongo依赖使用< >范围测试> < /范围在生产环境中运行时,不需要禁用嵌入式数据库。我们所要做的就是指定MongoDB连接细节(例如,主机和端口),我们就可以走了。

要在测试之外使用嵌入式DB,我们可以使用正确注册的Spring概要文件MongoClient(嵌入或生产)取决于活动概要。

我们还需要将生产依赖项的范围更改为<范围>运行> < /范围

4.嵌入式测试的争议

在一开始使用嵌入式数据库看起来是个不错的主意。实际上,当我们想要测试我们的应用程序是否在以下方面行为正确时,这是一个很好的方法:

  • < - >文件映射对象的配置
  • 自定义持久性生命周期事件监听器(参见AbstractMongoEventListener)
  • 任何直接与持久层工作的代码的逻辑

不幸的是,使用嵌入式服务器不能被视为“完全集成测试”。Flapdoodle的嵌入式MongoDB并不是官方的MongoDB产品。因此,我们不能确定它的行为是否与生产环境中完全相同。

如果我们希望在尽可能接近产品的环境中运行通信测试,更好的解决方案是使用环境容器,如Docker。

要了解更多关于Docker的信息,金宝搏官网188be请阅读我们之前的文章在这里

5.结论

Spring Boot使得运行验证文档映射和数据库集成是否正确的测试变得极其简单。通过添加正确的Maven依赖项,我们可以立即在Spring Boot集成测试中使用MongoDB组件。

我们需要记住这一点嵌入式MongoDB服务器不能被认为是“真实”服务器的替代品

所有示例的完整源代码都可以获得在GitHub

坚持下
通过引用开始使用Spring Data JPA学习Spring Data JPA课程:1188金宝搏亚洲
对这篇文章的评论关闭!