在春天使用嵌入式mongo进行本地测试

时间:2018-03-07 16:30:36

标签: mongodb spring-boot testing embedded-database

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

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

任何人都知道如何将它限制在一个配置文件中,这种方式在Eclipse和Gradle中运行时都能正常工作吗?

1 个答案:

答案 0 :(得分:2)

我可以想到两种方式:

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>

<强>摇篮

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的连接。但是当我将它设置为本地时,它会工作并向我显示已保存测试实体的ID。

如果您遇到同样的问题,可能有一个依赖项会再次加载Embedded MongoDB,即使您将其排除。通常它应该与测试依赖关系。检查您的依赖项。