如何在 SpringBoot v3.0.0 中使用嵌入式 MongoDB?

Suo*_*ori 11 java spring mongodb spring-boot embedded-mongodb

我正在尝试连接嵌入式 mongodb 并使用 MongoDbSpringIntegrationTest 对其进行测试。问题是相同的代码在 2.7.7 中适用于 spring boot,但在 3.0.0 中不适用于 spring boot。问题是如何在 3.0.0 中启用嵌入式 mongodb 进行 Spring Boot 测试?

pom.xml 中的依赖项:`

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>de.flapdoodle.embed</groupId>
        <artifactId>de.flapdoodle.embed.mongo</artifactId>
        <version>3.5.3</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
        <version>3.0.0</version>
    </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

`

应用程序属性:`

spring.data.mongodb.database=test
spring.data.mongodb.port=27017
spring.mongodb.embedded.version=4.0.2

Run Code Online (Sandbox Code Playgroud)

MongoDbSpringIntegrationTest:

@DataMongoTest
@ExtendWith(SpringExtension.class)
public class MongoDbSpringIntegrationTest {
  @DisplayName("given object to save"
      + " when save object using MongoDB template"
      + " then object is saved")
  @Test
  public void test(@Autowired MongoTemplate mongoTemplate) {
    // 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");
  }
}
Run Code Online (Sandbox Code Playgroud)

`

当我运行这个时,我收到此错误: org.springframework.dao.DataAccessResourceFailureException: Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{address=localhost:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused: no further information}}]

egi*_*ben 17

您正在使用的嵌入式 mongo 依赖项支持集成Spring boot 2.7.x。有一个版本Spring boot 3.x。您只需要对项目进行 2 处更改:

嵌入式 Mongo 依赖

pom.xml目前拥有:

<dependency>
    <groupId>de.flapdoodle.embed</groupId>
    <artifactId>de.flapdoodle.embed.mongo</artifactId>
    <version>3.5.3</version>
    <scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

将其更改为:

<dependency>
    <groupId>de.flapdoodle.embed</groupId>
    <artifactId>de.flapdoodle.embed.mongo.spring30x</artifactId>
    <version>4.5.2</version>
    <scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

注意artifactId是不同的。也是4.5.2本答案时的最新版本,可以随时在Maven上找到最新版本。

mongo版本配置

application.properties目前拥有:

spring.mongodb.embedded.version=4.0.2
Run Code Online (Sandbox Code Playgroud)

将其更改为:

de.flapdoodle.mongodb.embedded.version=4.0.2
Run Code Online (Sandbox Code Playgroud)

mongo 版本配置现在是从fladoodle 的命名空间解析的,而不是Spring 的。


Suo*_*ori 0

Spring Boot 3 支持已添加到 fladdoodle,如本期所述,我在 issues 中找到了我的问题的答案。