【问题标题】:Using embedded mongo in spring for local testing only在 spring 中使用嵌入式 mongo 仅用于本地测试
【发布时间】:2018-08-15 20:19:44
【问题描述】:

我正在尝试使用flapdoodle 嵌入式mongo 数据库('de.flapdoodle.embed:de.flapdoodle.embed.mongo') 对于本地手动测试,我会使用 H2 进行关系数据库测试。我只希望嵌入式 mongo 在“本地”SPring 配置文件下运行时启动,但我不知道如何实现它——它总是在任何配置文件下启动。

我尝试将@SpringBootApplication(exclude=EmbeddedMongoAutoConfiguration.class) 添加到我的应用程序中(我想我以后可以将该自动配置重新导入到单个配置文件中),但这似乎没有任何影响。

任何人都知道如何将其限制为单个配置文件,以在 Eclipse 和 Gradle 中运行时都可以使用?

【问题讨论】:

    标签: mongodb spring-boot testing embedded-database


    【解决方案1】:

    我可以想到两种方法:

    1- 仅在 maven 或 gradle 的特定配置文件中加载您的依赖项

    Maven

     <profiles>
        <profile>
            <id>local</id>
            <dependencies>
                <dependency>
                    <groupId>de.flapdoodle.embed</groupId>
                    <artifactId>de.flapdoodle.embed.mongo</artifactId>
                    <version>2.0.4-SNAPSHOT</version>
                </dependency>
            </dependencies>
        </profile>
     </profiles>
    

    Gradle

    if (project.hasProperty('local')) {
        dependencies {
           compile 'de.flapdoodle.embed:de.flapdoodle.embed.mongo:2.0.4-SNAPSHOT'
        }
    }
    

    2- 在课堂上使用 @Profile 和 @Import

    LoadEmbeded.java

    @Profile(value = "local")
    @Configuration
    @Import(EmbeddedMongoAutoConfiguration.class)
    public class LoadEmbeded {
    
    }
    

    希望它能给你一个想法


    编辑 1: 我已经测试了我的方法并制作了一个非常简单的应用程序。它适用于@Profile。这是我测试的。

    @SpringBootApplication(exclude = EmbeddedMongoAutoConfiguration.class)
    public class DemoApplication {
    
        @Autowired
        TestRepository repository;
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
        @Bean
        CommandLineRunner runner() {
            return args -> {
                System.out.println(repository.save(new Test()));
                System.out.println(repository.findAll());
            };
        }
    }
    
    @Repository
    interface TestRepository extends MongoRepository<Test, String> {
    
    }
    
    @Document
    class Test {
    
        @Id
        private String id;
    
        public String getId() {
            return id;
        }
    
        public Test setId(String id) {
            this.id = id;
            return this;
        }
    
        @Override
        public String toString() {
            return new ToStringBuilder(this)
                    .append("id", id)
                    .toString();
        }
    }
    
    @Configuration
    @Profile("local")
    @Import(EmbeddedMongoAutoConfiguration.class)
    class Load {
    
    }
    

    还有application.properties

    spring.profiles.active=local
    

    当我将活动配置文件更改为 本地 之外的其他内容时,它会在启动期间引发异常并抱怨 mongodb 的连接。但是当我将其设置为 local 时,它会起作用并向我显示已保存测试实体的 ID。

    如果您仍然遇到同样的问题,可能您的依赖项之一正在再次加载嵌入式 MongoDB,即使您将其排除在外。通常它应该带有测试依赖项。检查你的依赖关系。

    【讨论】:

    • 这很有趣,因为我之前在 Gradle 中没有遇到过这种类型的条件依赖。我想我应该更清楚我指的是 Spring 配置文件,并且通常从 Eclipse 内部运行。听起来这可能适用于只使用gradle bootRun 的人。
    • 选项 2 是我的想法的一部分,但我首先需要一种方法将其从所有其他配置文件中排除。到目前为止,我的尝试都失败了。
    • 我认为这与您使用的 IDE 无关。我正在使用 Intellij,但它仍然可以检测我在 maven 和 gradle 中的情况。我认为它应该工作。对于选项二:检查此spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration 并检查您的测试文件是否再次包含自动配置,如果您在测试中使用它并且不将其从配置文件中排除,它将加载自动配置,因为它已经在您的类路径中。此外,您可能还想测试 @Profile('!local') 是否也将其排除在外
    • @BradMace 我用工作示例更新了我的答案
    猜你喜欢
    • 2018-06-15
    • 2021-03-17
    • 2020-09-05
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    相关资源
    最近更新 更多