Spring Boot 1.5.4:在单元测试中排除配置类

Posted

技术标签:

【中文标题】Spring Boot 1.5.4:在单元测试中排除配置类【英文标题】:Spring Boot 1.5.4: exclude configuration class in unit test 【发布时间】:2018-03-21 12:40:13 【问题描述】:

我有一个 Spring Boot 项目,版本 1.5.4,有一个 MongoDb 配置类:

@Configuration
public class MongoConfig 

@Value("$spring.data.mongo.client.uri:mongodb://localhost:27017/database")
private String mongoURI;

@Bean
public MongoDbFactory mongoFactory() throws UnknownHostException
    return new SimpleMongoDbFactory(new MongoClientURI(mongoURI));


@Bean
public MongoTemplate mongoTemplate() throws UnknownHostException, MongoException
    return new MongoTemplate(mongoFactory());


在我的集成测试中,我想使用 Embedded Mongo (https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo)。

问题是MongoDb配置类在初始化Embedded mongo之前启动并尝试连接数据库,所以我的测试失败。如果我删除 MongoConfig 类,所有测试都运行良好。

我怎样才能只在我的测试执行中排除它?

【问题讨论】:

我知道这不是你的问题,但看看 testContainers:testcontainers.org 这是我用于测试的解决方案(主要是集成测试),这里有一个小教程:@ 987654323@ 【参考方案1】:

通过在测试类上使用以下注释来排除 MongoDB 自动配置。

@EnableAutoConfiguration(exclude=MongoAutoConfiguration.class, MongoDataAutoConfiguration.class)

然后在与您的测试类相同的路径中创建一个配置类并在那里定义您的 mongo bean。这将在应用程序启动期间被拾取

**@Configuration
public class MockConfigurations 
@Bean
@Primary
public MongoTemplate getMongoTemplate() 
//define your bean
return mongoTemplate;

**

【讨论】:

【参考方案2】:

请参考这里的答案。它有两种排除配置的方式。

Spring boot: apply @Configuration to certain package only

更新 1:

另外,我能想到的最有效的方法是使用 Spring 配置文件并为测试加载配置文件

定义您的 TestConfiguration 类并将其导入您的测试类。

@RunWith(SpringRunner.class)
@SpringBootTest
@Import(MyTestConfiguration.class)
public class MyTests 

    @Test
    public void exampleTest() 
        ...
    


https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html#boot-features-testing-spring-boot-applications-detecting-config

更新 2: 对于 EmbeddedMongoAutoConfiguration,请参阅此处的详细答案。

How do you configure Embedded MongDB for integration testing in a Spring Boot application?

【讨论】:

我不想仅仅为了单元测试而改变我的主应用程序类。 @Import(MyTestsConfiguration.class) 是一个很好的解决方案,但我发现一个系统可以避免为我的测试加载无用的类。 问题是我不知道如何成为我的 MyTestsConfiguration.class,因为我想激活 EmbeddedMongoAutoConfiguration.class【参考方案3】:

我在我的测试类中用这个配置解决了这个问题:

@RunWith(SpringRunner.class)
@ComponentScan("it.app.server.dal","it.app.server.listener")
@DataMongoTest() //mongoDB
public class ListenerTests 
   ...

注释@DataMongoTest() 加载我的Embedded MongoDb 并且使用@ComponentScan 我可以加载我在测试中需要的服务和存储库。

【讨论】:

如果我想测试一个可以访问 mongodb 的控制器,这个解决方案不起作用。

以上是关于Spring Boot 1.5.4:在单元测试中排除配置类的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 学习之二(spring boot单元测试)

Spring Boot中编写单元测试

Spring Boot 单元测试示例

spring boot单元测试spring context重复加载问题

Spring Boot 项目在 IDEA 中 进行单元测试

如何从单元测试中排除名称中带有“Test”的帮助项目?