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

Java Spring Boot 1.5.4:在单元测试中排除配置类,java,unit-testing,spring-boot,spring-data-mongodb,spring-test,Java,Unit Testing,Spring Boot,Spring Data Mongodb,Spring Test,我有一个Spring启动项目,版本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 UnknownHostExcept

我有一个Spring启动项目,版本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());
}
}
在我的集成测试中,我希望使用嵌入式Mongo()

问题是MongoDb配置类在嵌入式mongo初始化之前启动,并尝试连接到数据库,所以我的测试失败。如果删除MongoConfig类,所有测试都可以正常工作


如何仅在测试执行时排除它?

请参考此处的答案。它有两种排除配置的方法

更新1:

或者,我能想到的最有效的方法是使用弹簧配置文件并加载用于测试的配置文件

定义TestConfiguration类并将其导入测试类

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

    @Test
    public void exampleTest() {
        ...
    }

}

更新2: 有关EmbeddedMongouto配置,请参阅此处的详细答案


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

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

注释@DataMongoTest()加载我的EmbbedMongoDB,使用@ComponentScan,我可以加载测试中需要的服务和存储库。

通过在测试类上使用下面的注释排除MongoDb自动配置

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

    @Test
    public void exampleTest() {
        ...
    }

}
@EnableAutoConfiguration(exclude={mongoutoconfiguration.class, MongoDataAutoConfiguration.class})

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

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

我不想仅仅为了单元测试而更改我的主应用程序类。@导入(MyTestsConfiguration.class)是一个很好的解决方案,但我发现一个系统可以避免为我的测试加载无用的类。问题是我不知道如何成为我的MyTestsConfiguration.class,因为我想激活EmbeddedMongoAtoConfiguration.classI我知道这不是你的问题所在,但看看testContainers:这是我用于测试的解决方案(主要是集成测试),这里有一个小教程:如果我想测试访问mongodb的控制器,这个解决方案就不起作用。