【问题标题】:Testing @ConditionalOnClass autoconfigurations测试@ConditionalOnClass 自动配置
【发布时间】:2017-04-25 11:18:11
【问题描述】:

我们开发了许多“内部”Spring Boot 启动器和自动配置,支持各种 NFR,例如日志记录、配置、安全等。

我们面临的最大测试挑战是如何测试@ConditionalOnClass 自动配置的不同组合。

例如:

@Configuration
@ConditionalOnClass(Foo.class)
public class Config1 {

}

@Configuration
@ConditionalOnClass(Bar.class)
public class Config2 {

}

@Configuration
@ConditionalOnMissingClass(Foo.class)
public class Config3 {

}    

我们如何操作测试项目的类路径来测试类路径上存在的FooBar jar 文件的各种组合?那里有图书馆吗?我想知道 Spring 家伙是如何做到这一点的?

【问题讨论】:

  • 为什么您需要对此进行测试,而不是对底层功能/组件进行单元测试? ConditionalOn... 到处都在使用并且极不可能被破坏,也就是说,是否真的值得您花时间测试框架无论如何都会完成的事情。
  • 我们有多个@ConditionalOnClassautoconfigurations,根据不同的类路径组合,它们的行为方式略有不同。这是一个美化的 if-else 语句,其中评估的布尔条件是类路径上是否存在特定 jar。
  • 那么为什么不让客户端应用程序测试它们期望加载的内容,因为它们将具有正确/预期的类路径条件,如果这很关键,它们确实应该如此。否则,您将进入一个受伤的世界,因为您需要不同的 maven 配置文件来正确排除/设置依赖项,然后进行测试,但又为什么要这样做。自动配置很好,直到它不是,如果这些自动配置非常关键,也许配置不应该是自动的,而是通过注释元注释手动定义的。
  • @DarrenForsythe 感谢您的提示。我从来不知道可以将依赖项放在配置文件中!这可能正是我需要的。
  • 你找到解决办法了吗?

标签: java spring-boot integration-testing


【解决方案1】:

我认为您正在寻找的是 ApplicationContextRunner。

@Test
public void whenDependentClassIsNotPresent_thenBeanMissing() {
    new ApplicationContextRunner().withUserConfiguration(ConditionalOnClassConfiguration.class)
        .withClassLoader(new FilteredClassLoader(DependentClass.class))
        .run(context -> assertThat(context).doesNotHaveBean(BeanConditionalOnDependentClass.class));
}

来源:https://www.baeldung.com/spring-boot-context-runner

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 2021-05-20
    相关资源
    最近更新 更多