Spring 3.x集成测试:如何手动启动Embedded MongoDB 4.9.2?
适配de.flapdoodle.embed.mongo 4.9.2的嵌入式MongoDB手动启动方案
1. 确认依赖配置
首先确保测试依赖中引入对应版本的嵌入式MongoDB包,Maven配置如下:
<dependency> <groupId>de.flapdoodle.embed</groupId> <artifactId>de.flapdoodle.embed.mongo</artifactId> <version>4.9.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
2. 手动启动嵌入式Mongo的配置类
4.9.2版本重构了API,原有的MongoStarter相关调用方式变更,以下是适配后的配置类:
import de.flapdoodle.embed.mongo.MongoDExecutable; import de.flapdoodle.embed.mongo.MongoDStarter; import de.flapdoodle.embed.mongo.config.IMongodConfig; import de.flapdoodle.embed.mongo.config.MongodConfigBuilder; import de.flapdoodle.embed.mongo.config.Net; import de.flapdoodle.embed.mongo.distribution.Version; import de.flapdoodle.embed.process.runtime.Network; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.TestConfiguration; import org.springframework.context.annotation.Profile; import org.springframework.data.mongodb.core.MongoTemplate; import com.mongodb.client.MongoClients; @TestConfiguration @Profile("test") public class EmbeddedMongoConfig { private MongoDExecutable mongoDExecutable; @Bean(destroyMethod = "stop") public MongoDExecutable mongoDExecutable() throws Exception { // 构建MongoDB实例配置,可指定具体版本(如Version.V6_0_10)或用生产稳定版 IMongodConfig mongodConfig = new MongodConfigBuilder() .version(Version.Main.PRODUCTION) .net(new Net("localhost", Network.getFreeServerPort(), Network.localhostIsIPv6())) .build(); MongoDStarter starter = MongoDStarter.getDefaultInstance(); mongoDExecutable = starter.prepare(mongodConfig); mongoDExecutable.start(); return mongoDExecutable; } @Bean public MongoTemplate mongoTemplate() throws Exception { int port = mongoDExecutable().getConfig().net().getPort(); return new MongoTemplate(MongoClients.create("mongodb://localhost:" + port), "test-db"); } }
3. 测试类中启用配置
在你的控制器集成测试类中,通过@Import加载配置,并指定测试环境:
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; import org.springframework.test.context.ActiveProfiles; @SpringBootTest @AutoConfigureMockMvc @ActiveProfiles("test") @Import(EmbeddedMongoConfig.class) public class YourControllerIntegrationTest { // 注入MockMvc或MongoTemplate编写测试逻辑 // 示例: // @Autowired // private MockMvc mockMvc; // // @Test // public void testControllerEndpoint() throws Exception { // // 测试代码 // } }
关键说明
@Profile("test")限定配置仅在测试环境生效,避免干扰生产环境destroyMethod = "stop"保证测试结束后自动终止嵌入式Mongo进程,释放资源Network.getFreeServerPort()自动分配空闲端口,避免端口冲突问题- 如需固定版本,将
Version.Main.PRODUCTION替换为具体版本,如Version.V6_0_10
内容的提问来源于stack exchange,提问作者Ana Rodríguez Fernández
相关产品推荐
相关产品推荐

