gpt4 book ai didi

java - Spring 启动 : How to override default properties in Unit tests

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:00:58 24 4
gpt4 key购买 nike

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

@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 激活“测试”配置文件,这将导致加载“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 也不起作用,因为它不会覆盖单个属性,而是覆盖整个文件,也就是说,我需要重新定义和复制所有内容。)

编辑:

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

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

最佳答案

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

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

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

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

例如,如果我们定义一个stagingtest 环境,这意味着我们必须定义一个staging 或test profile 然后是application-staging .propertiesapplication-test.properties

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

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

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

@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 ;
}
}

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

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

关于java - Spring 启动 : How to override default properties in Unit tests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53409635/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com