如何全局禁用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
相关产品推荐
相关产品推荐

