【问题标题】:Spring Boot: How to override default properties in Unit testsSpring Boot:如何在单元测试中覆盖默认属性
【发布时间】:2018-11-21 10:08:01
【问题描述】:

我尝试为我的单元测试加载第二个属性文件, 这会覆盖一些属性。

@Configuration 上使用@PropertySource 加载它不起作用, 用@TestPropertySource 加载它也不起作用。 只有在@TesPropertySource 上直接设置properties 才有效, 但是当我尝试将它变成元注释时它不起作用。

这是一个示例项目:https://github.com/cptwunderlich/SpringTestProperties

我更愿意加载一个文件来影响所有测试(例如使用@PropertySource),但如果这不起作用,至少有一个自定义元注释会很好,所以我不必把它放在每一个测试中。 基本上我想将一些数据导入数据库以进行测试(spring.datasource.data),然后还要更改使用的数据库 - 无需复制整个配置并且必须在两个地方更改它时间。

重要的部分:

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

    @Value("${my.test.property}")
    private String testproperty;

    @Test
    public void assertValue() {
        Assert.assertEquals("foobar", testproperty);
    }

}

或者配置类在测试包中

@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
@PropertySource("classpath:application-test.properties")
public class GlobalTestConfig {
}

更新:

答案中的主要建议是使用@ActiveProfile 激活“test”配置文件,这将导致加载“application-test.yaml”。 这比@TestPropertySource 好,但我仍然需要在每个测试类上添加注释。我尝试创建一个元注释 - should work - 所以至少我只有一个自定义注释可以捆绑其他设置。但这不起作用。

完美的解决方案是使用一个配置类全局设置这些设置,而不必在每个测试上添加注释。 我仍在寻找那个解决方案,或者至少在结束这个问题之前调试元注释。 编辑:我创建了一个 Jira 问题:SPR-17531

编辑

好的,我有点困惑,所以我重新测试了所有不同的组合:

  • @TestPropertySource(locations = "classpath:application-test.properties") 在测试中,实际上现在有效。嗯。
  • @ActiveProfiles("test") 测试作品。
  • 带有@ActiveProfiles 的元注释工作。编辑:确实...
  • 任何类型的全局配置(TestPropertySource、ActiveProfiles、Propertysource)不起作用
  • (在 test/resources 中拥有 application.properties 也不起作用,bc。它不会覆盖单个属性,而是覆盖整个文件,即,我需要重新定义和复制所有内容。)

编辑:

好吧,我错了。元注释确实有效 - 我忘记设置保留策略,默认为 CLASS。添加@Retention(RUNTIME) 可以解决此问题。

似乎没有办法在代码中全局设置它(即,无需在我的 IDE 中配置测试的运行方式),所以我现在必须使用配置文件。

【问题讨论】:

  • 我建议阅读 Spring Boot 参考指南,了解 Spring Boot 中的属性如何工作(参见 docs.spring.io/spring-boot/docs/current/reference/html/…)。简而言之,使用@ActiveProfiles("test") 和spring boot 将同时加载application.propertiesapplication-test.properties。后者将覆盖前者的属性。

标签: java spring unit-testing spring-boot spring-boot-test


【解决方案1】:

您可以使用@ActiveProfiles("test")。这会将application-test.yml 属性设置到测试环境中。

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test")
public class TestconfigApplicationTests {
    ...
}

如果我们需要针对不同的环境,Boot 中有一个内置机制,因此不需要额外的库或重构。

我们可以简单地在src/main/resources 目录中定义一个application-environment.properties 文件——然后设置一个具有相同环境名称的Spring 配置文件。

例如,如果我们定义 stagingtest 环境,这意味着我们必须先定义暂存或测试配置文件,然后再定义 application-staging.propertiesapplication-test.properties

这个env 文件将被加载并优先于默认属性文件application.properties。请注意,仍然会加载默认文件,只是当发生属性冲突时,环境特定的属性文件优先,这意味着application-staging.propertiesapplication-test.properties 中指定的属性将覆盖application.properties 中的属性。

每个测试类都使用自己的配置文件,因此您需要为每个类指定活动配置文件。

您可能会感兴趣的另一件事是,您可以通过 configuration 类模拟服务

@Configuration
@Profile("mockEntityService")
public class EntityServiceMockProvider {

    @Bean
    @Primary
    public EntityService entityService() {
        EntityService mockedEntityService = Mockito.mock(EntityService.class);

        Entity entity= Mockito.mock(Entity.class);
        when(mockedEntityService.save(any(Entity.class)))
                .thenReturn(entity);

        return mockedEntityService ;
    }
}

在测试类中,您可以使用多个活动配置文件: 例如@ActiveProfiles({"test", "mockEntityService"})

因此,您将使用模拟实现,而不是使用 EntityService 的实际实现。

【讨论】:

  • TY 为您解答。默认情况下会使用“application-test.yml”,还是我需要在某处设置名称?这些附加属性,例如,它们可以覆盖现有的属性,还是我需要复制我的整个配置?最后 - 我在哪里放置注释?在每个测试类上,还是在一个 Config..?
  • 我编辑了我的答案以涵盖您的问题以及一些可能对您有所帮助的其他材料
  • 谢谢。好吧,似乎把它放在 @Configuration 类上并不能解决问题。您必须将它放到测试中并且创建元注释失败,即使根据文档应该是可能的:docs.spring.io/spring-framework/docs/current/javadoc-api/org/…
  • 配置上的@Profile 创建一个新的配置文件配置,就像应用程序测试属性文件的存在一样,它将创建测试配置文件。
  • 我无意中点击了你的答案上的“编辑”而不是我的问题 x|但我不能撤回它,它正在等待审查。希望审稿人能明白这一点……
【解决方案2】:

您可以将 application.properties 添加到

src/test/resources

然后,此文件中的所有属性都会覆盖 src/main/resources/application.properties 中的这些属性。

因此您不需要配置文件和任何其他注释,例如 @TestPropertySource

【讨论】:

  • 不,这将完全替换 application.properties,也就是说,您不能只将要覆盖的那些放在那里,您需要复制并更改整个配置。我想避免这种情况,公元前。这将不可避免地导致分歧和错误。
  • 你能试试吗?我为带有spring-boot 1.5.12的应用程序配置了此配置,并且测试/资源中的application.properties只有很少的属性。并且所有在 main/resources 中的属性都有原来的值
  • 我之前测试过,我又重新测试了一次——只是为了你——但它仍然不起作用。你可以自己试试。我链接了一个 Github 存储库。检查一下,重命名 application-test.properties 并自己看看。
  • 这确实至少在我正在使用的 IDE 中有效。
猜你喜欢
  • 2018-07-12
  • 2020-05-03
  • 2018-07-14
  • 2019-03-20
  • 2014-09-15
  • 2016-06-06
  • 2018-11-26
  • 2015-08-30
  • 1970-01-01
相关资源
最近更新 更多