【问题标题】:Spring application - Override app properties by test propertiesSpring 应用程序 - 通过测试属性覆盖应用程序属性
【发布时间】:2019-07-09 22:45:47
【问题描述】:

我是 spring 新手,如果有人能帮助我解决这个问题,我将不胜感激。

我有一个 Spring Boot 应用程序 App1,它分别在主包和测试包中具有以下数据库属性:

src/main/resources/app1.properties

src/test/resources/app1-test.properties

假设 app1.properties 包含 oracle db 属性,app1-test.properties 包含 h2 db 属性

通常,当我启动 App1 应用程序时,它会从 app1.properties 中获取属性

我的要求是,当我创建应用程序的测试实例(比如 TestApp1)时,应该选择 app1-test.properties 而不是 app1.properties。

我怎样才能做到这一点?请帮忙。

【问题讨论】:

  • 这两个属性都将在您构建应用程序时包含在内。当您启动应用程序时,您可以使用配置文件 java -jar myApp.jar --spring.profiles=test 运行它
  • 在这里您可以阅读个人资料:baeldung.com/spring-profiles

标签: spring spring-boot


【解决方案1】:

如果您指的是在为您的应用程序运行测试类时,您可以在类上方包含注释 @ActiveProfiles("test") 以包含 app1-test.properties 配置。

类的顶部应该是这样的:

    @ActiveProfiles("test")
    @ExtendWith(SpringExtension.class)
    @SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT)
    public class YourTestClassName {

【讨论】:

    【解决方案2】:

    @domorecalculus 的答案看起来不错。虽然,由于我实际上从未使用过@ActiveProfile,所以我会继续发布一个替代方案,以防这不是您想要的:

    @RunWith(SpringRunner.class)
    @TestPropertySource(locations = "classpath:application-test.properties")
    @SpringBootTest
    public class InvalidTransactionTests {
        ...
    }
    

    一个优点可能是此注释将您的src/main/test 与您的src/main/java 完全分开。一个缺点(我可能错了)可能是基本名称“application.properties”不明确,因为该文件已经存在于src/main/java

    【讨论】:

      【解决方案3】:

      将属性文件放在与 application.property 相同的位置,并遵循命名约定 appliaction-{profile}.properties,如 application-dev.properties、application-test.properties、application-prod.properties

      在 application.properties 中设置 spring.profiles.active=test 以使用测试属性和开发属性,您可以设置 spring.profiles.active=dev 并且默认情况下将选择 application.properties

      【讨论】:

        【解决方案4】:

        正如@domorecalculus 所回答的,标准方法是使用Spring 配置文件。我建议您在 Spring Profiles 中进行更多挖掘,它不仅在配置级别而且在代码级别为您提供灵活性,例如您可以使用 @Profile(value = "dev") 注释类,以便加载该类仅在开发模式下运行应用程序时。您可以将其视为策略模式的实现,但您不能在运行时更改配置文件。

        回到你的问题,我以前是这样做的:

        @RunWith(SpringRunner.class)
        @SpringBootTest(classes = MyApp.class)
        @ActiveProfiles("test")
        public class TestMyService { 
         .....
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-07
          • 2021-04-13
          • 1970-01-01
          • 1970-01-01
          • 2019-03-02
          • 2019-09-05
          • 1970-01-01
          相关资源
          最近更新 更多