如何在Spring Boot JUnit测试中排除*AutoConfiguration类?

Hen*_*wan 62 java junit spring spring-boot

我试过了:

@RunWith(SpringJUnit4ClassRunner.class)
@EnableAutoConfiguration(exclude=CrshAutoConfiguration.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class LikeControllerTest {
Run Code Online (Sandbox Code Playgroud)

然而,CRaSSHD仍然启动.虽然目前它不会损害测试,但我想在单元测试期间禁用不必要的模块以加快速度并避免潜在的冲突.

Kan*_*ane 48

另一种排除自动配置类的简单方法,

application.yml文件中添加以下类似的配置,

---
spring:
  profiles: test
  autoconfigure.exclude: org.springframework.boot.autoconfigure.session.SessionAutoConfiguration
Run Code Online (Sandbox Code Playgroud)

  • @Kane我发现在`*Test`类上指定`@TestPropertySource(properties = {"spring.autoconfigure.exclude = comma.seperated.ClassNames,com.example.FooAutoConfiguration"})`更容易.节省了必须为不希望的配置的每个排列定义配置文件. (5认同)
  • 要向属性`spring.autoconfigure.exclude`添加多个自动配置类,只需将所有类名称分隔为`,` (3认同)

Mat*_*t C 28

我有一个类似的用例,我想隔离测试一个Spring Boot配置的存储库(在我的情况下没有Spring Security自动配置,但我的测试失败了).@SpringApplicationConfiguration使用SpringApplicationContextLoader和具有JavaDoc说明

可用于测试非Web功能(如存储库层)或启动完全配置的嵌入式servlet容器.

但是,就像你自己一样,我无法弄清楚你是如何配置测试只使用主配置入口点测试存储库层,即使用你的方法@SpringApplicationConfiguration(classes = Application.class).

我的解决方案是创建一个专用于测试的全新应用程序上下文.所以在src/test/java中,我在一个名为repo的子包中有两个文件

  1. RepoIntegrationTest.java
  2. TestRepoConfig.java

哪里RepoIntegrationTest.java

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestRepoConfig.class)
public class RepoIntegrationTest {
Run Code Online (Sandbox Code Playgroud)

并且TestRepoConfig.java

@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
public class TestRepoConfig {
Run Code Online (Sandbox Code Playgroud)

它让我摆脱了麻烦,但如果来自Spring Boot团队的任何人都可以提供替代推荐的解决方案,那将非常有用


cod*_*het 22

最佳答案并不指向更简单,更灵活的解决方案。

只需放置一个

@TestPropertySource(properties=
{"spring.autoconfigure.exclude=comma.seperated.ClassNames,com.example.FooAutoConfiguration"})
@SpringBootTest
public class MySpringTest {...}
Run Code Online (Sandbox Code Playgroud)

测试类上方的注释。这意味着其他测试不受当前测试的特殊情况的影响。如果存在影响大多数测试的配置,请考虑使用spring配置文件代替当前的最佳答案。

感谢@skirsch鼓励我将其从评论升级为答案。


Stu*_*art 11

我有类似的问题,但我找到了一个可以帮助别人的不同解决方案.我使用Spring Profiles来分离测试和应用程序配置类.

  1. 使用特定配置文件创建TestConfig类,并从此处希望的组件扫描中排除任何应用程序配置.

  2. 在测试类中,将配置文件设置为与TestConfig匹配,并使用@ContextConfiguration批注包含它.

例如:

组态:

@Profile("test")
@Configuration
@EnableWebMvc
@ComponentScan(
    basePackages="your.base.package",
    excludeFilters = {
            @Filter(type = ASSIGNABLE_TYPE,
                    value = {
                            ExcludedAppConfig1.class,
                            ExcludedAppConfig2.class
            })
    })
public class TestConfig { ...}
Run Code Online (Sandbox Code Playgroud)

测试:

@ActiveProfiles("test")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
@WebAppConfiguration
public class SomeTest{ ... }
Run Code Online (Sandbox Code Playgroud)


Jea*_*ond 7

我认为@EnableAutoConfiguration如果你@SpringApplicationConfiguration用来加载你的Application类,在测试类上使用注释是行不通的.问题是你已经@EnableAutoConfigurationApplication类中有一个不排除的注释CrshAutoConfiguration.Spring使用该注释而不是测试类中的注释来执行bean的自动配置.

我认为您最好的选择是为您的测试使用不同的应用程序上下文并排除CrshAutoConfiguration该类.

我做了一些测试,似乎@EnableAutoConfiguration在测试类中完全忽略了如果你正在使用@SpringApplicationConfiguration注释和SpringJUnit4ClassRunner.

  • 如何使用多个不同的应用程序构建项目?Spring Boot不会扫描其他应用程序吗?这种情况的推荐最佳做法是什么?我认为这是常见用法,测试配置与应用程序配置有些不同. (3认同)

Jam*_*ane 6

使用新的@SpringBootTest注释,我接受了这个答案并修改它以使用@SpringBootApplication配置类的配置文件.该@Profile注释是必要的,这个类中需要这一点,因为其他的测试配置做不同的组件扫描特定的集成测试只拾起.

这是配置类:

@Profile("specific-profile")
@SpringBootApplication(scanBasePackages={"com.myco.package1", "com.myco.package2"})
public class SpecificTestConfig {

}
Run Code Online (Sandbox Code Playgroud)

然后,测试类引用此配置类:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = { SpecificTestConfig.class })
@ActiveProfiles({"specific-profile"})
public class MyTest {

}
Run Code Online (Sandbox Code Playgroud)


小智 5

@SpringBootTest(classes = {Application.class}
              , webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
              , properties="spring.autoconfigure.exclude=com.xx.xx.AutoConfiguration"
               )
Run Code Online (Sandbox Code Playgroud)

参考:https : //github.com/spring-projects/spring-boot/issues/8579