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

标签 java spring mongodb spring-boot

我有一个相当简单的 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/

相关文章:

mongodb - 如何从 MongoDB 集合中获取具有匹配键的最后 N 个元素

java - 是否有任何 apache utils 打印数组一些可理解的字符串

java - 对单例 "manager"对象的静态引用的缺点?

java - 如何在XML中配置属性?

java - 模型和 View 404 问题

mongodb - 如何在 MongoDB C# 驱动程序中使用 SafeMode

node.js - Meteor Mongo BulkOp 将 ObjectID 转换为普通对象

java - 对我的 logout.jsp 代码的其他修复

java - 调用网络服务后的 XMLStreamReaderException 响应

spring - 如何为gradle spring-boot项目构建可执行jar