gpt4 book ai didi

java - 如何配置 Embedded MongoDB 以在 Spring Boot 应用程序中进行集成测试?

转载 作者:IT老高 更新时间:2023-10-28 13:03:57 24 4
gpt4 key购买 nike

我有一个相当简单的 Spring Boot 应用程序,它公开了一个小型 REST API 并从 MongoDB 实例中检索数据。对 MongoDB 实例的查询通过基于 Spring Data 的存储库。下面是一些关键的代码。

// Main application class
@EnableAutoConfiguration(exclude={MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
@ComponentScan
@Import(MongoConfig.class)
public class ProductApplication {
public static void main(String[] args) {
SpringApplication.run(ProductApplication.class, args);
}
}
// Product repository with Spring data
public interface ProductRepository extends MongoRepository<Product, String> {

Page<Product> findAll(Pageable pageable);

Optional<Product> findByLineNumber(String lineNumber);
}
// Configuration for "live" connections
@Configuration
public class MongoConfig {

@Value("${product.mongo.host}")
private String mongoHost;

@Value("${product.mongo.port}")
private String mongoPort;

@Value("${product.mongo.database}")
private String mongoDatabase;

@Bean(name="mongoClient")
public MongoClient mongoClient() throws IOException {
return new MongoClient(mongoHost, Integer.parseInt(mongoPort));
}

@Autowired
@Bean(name="mongoDbFactory")
public MongoDbFactory mongoDbFactory(MongoClient mongoClient) {
return new SimpleMongoDbFactory(mongoClient, mongoDatabase);
}

@Autowired
@Bean(name="mongoTemplate")
public MongoTemplate mongoTemplate(MongoClient mongoClient) {
return new MongoTemplate(mongoClient, mongoDatabase);
}
}
@Configuration
@EnableMongoRepositories
public class EmbeddedMongoConfig {

private static final String DB_NAME = "integrationTest";
private static final int DB_PORT = 12345;
private static final String DB_HOST = "localhost";
private static final String DB_COLLECTION = "products";

private MongodExecutable mongodExecutable = null;

@Bean(name="mongoClient")
public MongoClient mongoClient() throws IOException {
// Lots of calls here to de.flapdoodle.embed.mongo code base to
// create an embedded db and insert some JSON data
}

@Autowired
@Bean(name="mongoDbFactory")
public MongoDbFactory mongoDbFactory(MongoClient mongoClient) {
return new SimpleMongoDbFactory(mongoClient, DB_NAME);
}

@Autowired
@Bean(name="mongoTemplate")
public MongoTemplate mongoTemplate(MongoClient mongoClient) {
return new MongoTemplate(mongoClient, DB_NAME);
}

@PreDestroy
public void shutdownEmbeddedMongoDB() {
if (this.mongodExecutable != null) {
this.mongodExecutable.stop();
}
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestProductApplication.class)
@IntegrationTest
@WebAppConfiguration
public class WtrProductApplicationTests {

@Test
public void contextLoads() {
// Tests empty for now
}

}
@EnableAutoConfiguration(exclude={MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
@ComponentScan
@Import(EmbeddedMongoConfig.class)
public class TestProductApplication {

public static void main(String[] args) {
SpringApplication.run(TestProductApplication.class, args);
}
}

所以这里的想法是让集成测试(目前为空)连接到嵌入式 mongo 实例,而不是“实时”实例。但是,它不起作用。我可以看到测试连接到 Mongo 的“实时”实例,如果我关闭它,构建就会失败,因为它仍在尝试连接到 Mongo 的实时实例。有人知道为什么吗?如何让测试连接到嵌入式实例?

最佳答案

自 Spring Boot 1.3 版以来,有一个 EmbeddedMongoAutoConfiguration开箱即用的类。这意味着您根本不必创建配置文件,如果您想更改内容,您仍然可以。

Auto-configuration for Embedded MongoDB has been added. A dependency on de.flapdoodle.embed:de.flapdoodle.embed.mongo is all that’s necessary to get started. Configuration, such as the version of Mongo to use, can be controlled via application.properties. Please see the documentation for further information. (Spring Boot Release Notes)

必须添加到 application.properties 文件中的最基本和最重要的配置是
<strong>spring.data.mongodb.port=0</strong> (0表示从免费的中随机选择)

更多详情请查看:Spring Boot Docs MongoDb

关于java - 如何配置 Embedded MongoDB 以在 Spring Boot 应用程序中进行集成测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31568351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com