【问题标题】:Is there a way to not start the spring boot application depending on the active profile?有没有办法根据活动配置文件不启动 spring boot 应用程序?
【发布时间】:2020-03-07 21:23:31
【问题描述】:

我想知道是否有办法根据活动配置文件不启动 Spring Boot 应用程序。原因是,我有两个配置文件:本地配置文件和集成配置文件。当配置文件在本地时,我会在本地启动应用程序。如果配置文件是集成的,我希望测试不启动应用程序,而只是使用我在配置类中设置的端点,以便它实际使用部署的 Spring Boot 应用程序。

@SpringBootTest(
        webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT
)
@ContextHierarchy({
        @ContextConfiguration(
                initializers = ConfigFileApplicationContextInitializer.class,
                classes = TestConfiguration.class,
                loader = SpringBootContextLoader.class
        ),
        @ContextConfiguration(
                initializers = ConfigFileApplicationContextInitializer.class,
                classes = Application.class,
                loader = SpringBootContextLoader.class
        ),
    }
)
public class SpringContextConfiguration {

    @Before
    public void init(){}

}

【问题讨论】:

  • 这样做没有任何意义。除非您正在进行验收测试,否则不应有“已部署的应用程序”。集成测试应该建立自己的测试环境,允许并行开发/测试。
  • 不要。为此编写单独的测试,或者只是在启动测试之前在本地手动启动它(或让您的构建脚本执行此操作)。

标签: java spring spring-boot testing


【解决方案1】:

在 Spring Boot 中,可以使用@Profile 注解。您可以定义两个 @Beans 实现仅在启动时创建的 Foo 接口,并将它们注入到仅在您的 don't start profile 中创建的 Bar 中。

@Profile('dont')
@Bean
class Bar {

    private Foo foo;

    public Bar(Foo foo) {
        this.foo = foo;
    }
}

interface Foo {

}

@Bean
@Profile('dont')
class Foo1 implements Foo {

}

@Bean
@Profile('dont')
class Foo2 implements Foo {

}

这将导致在设置配置文件dont 时阻止您的应用程序启动的歧义。

【讨论】:

  • 这也将防止发生其他任何事情,例如运行测试。
  • 谢谢!我试过应用你的建议。虽然应用程序实际上没有启动,但测试失败了,因为 Spring 抛出了一个错误。有没有办法捕捉到这个错误,所以测试仍然会继续? @Kayaman - 确实是的。这正是发生的事情。
  • @Ryan 做对了。你永远不会让它与“不要启动 Spring,但无论如何都要运行测试”一起工作。测试仍然是 Spring 的一部分,因此如果您认为自己的想法可行,那么您将在这方面浪费大量时间。
  • @Kayaman - 是的。这也是我想通的。我可能最终会得到两个测试运行器,一个用于本地,一个用于集成。每个测试运行器都会有不同的上下文配置。非常感谢!
猜你喜欢
  • 2020-09-22
  • 2015-04-09
  • 2021-07-21
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多