You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何全局禁用Maven测试阶段Spring Data MongoDB的默认连接行为?

问题

基于Maven构建的Java项目,添加spring-boot-starter-data-mongodb依赖后,即使测试代码完全不涉及数据库交互,测试阶段Spring Data MongoDB仍会尝试用默认配置(localhost:27017)连接数据库。虽然不影响构建,但日志里会输出烦人的连接异常。

重现步骤

  • 使用Spring Initializr创建基础Spring应用
  • 添加spring-boot-starter-data-mongodb依赖
  • 执行Maven构建,查看日志中的连接异常信息

示例POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

构建日志中的异常信息

13:40:15.551 [cluster-ClusterId{value='64ca409f5fb52846dda0f121', description='null'}-localhost:27017] [26] INFO  org.mongodb.driver.cluster - Exception in monitor thread while connecting to server localhost:27017
com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:73) ~[mongodb-driver-core-4.8.2.jar:?]
at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:183) ~[mongodb-driver-core-4.8.2.jar:?]
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:198) ~[mongodb-driver-core-4.8.2.jar:?]
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:158) ~[mongodb-driver-core-4.8.2.jar:?]
at java.lang.Thread.run(Thread.java:833) ~[?:?]
Caused by: java.net.ConnectException: Connection refused
at sun.nio.ch.Net.pollConnect(Native Method) ~[?:?]
at sun.nio.ch.Net.pollConnectNow(Net.java:672) ~[?:?]
at sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:549) ~[?:?]
at sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) ~[?:?]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) ~[?:?]
at java.net.Socket.connect(Socket.java:633) ~[?:?]
at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:107) ~[mongodb-driver-core-4.8.2.jar:?]
at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:82) ~[mongodb-driver-core-4.8.2.jar:?]
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:68) ~[mongodb-driver-core-4.8.2.jar:?]

已知可以通过@SpringBootTest排除配置修改单个测试的行为,但想知道是否有全局禁用该连接行为的方法?

解决方案

下面是几种全局禁用测试阶段MongoDB自动连接的方法:

1. 通过测试环境配置文件禁用MongoDB自动配置

在src/test/resources/application.properties(或application.yml)中添加配置,全局关闭MongoDB的自动配置:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration

如果只需要关闭同步MongoDB配置,只排除MongoAutoConfiguration即可。

2. 使用测试专用的配置类全局排除

创建一个测试全局配置类,放在src/test/java下,通过@TestConfiguration和@EnableAutoConfiguration的exclude属性实现全局排除:

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
import org.springframework.boot.test.context.TestConfiguration;

@TestConfiguration
@EnableAutoConfiguration(exclude = MongoAutoConfiguration.class)
public class TestGlobalMongoConfig {
}

这个配置类会被所有测试自动加载,无需在每个测试类上单独声明。

3. 调整MongoDB客户端的连接行为(不推荐,仅临时方案)

如果不想完全禁用自动配置,可以通过配置让MongoDB客户端快速超时,减少日志输出:

spring.data.mongodb.client.options.connect-timeout=1
spring.data.mongodb.client.options.socket-timeout=1

这种方法只是缩短超时时间,仍会有少量日志输出,不如直接禁用自动配置彻底。

内容的提问来源于stack exchange,提问作者jonb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 03:06:03