java-Spring Boot:如何在单元测试中覆盖默认属性
作者:互联网
我尝试为单元测试加载第二个属性文件,
那会覆盖一些属性.
在@Configuration上使用@PropertySource加载它无效,
用@TestPropertySource加载它也不起作用.
仅在@TesPropertySource上直接设置属性有效,
但是当我尝试将其添加为元注释时,它不起作用.
这是一个示例项目: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);
}
}
也可以在测试包中使用config类:
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
@PropertySource("classpath:application-test.properties")
public class GlobalTestConfig {
}
更新:
答案中的主要建议是使用@ActiveProfile激活“测试”配置文件,这将导致加载“ application-test.yaml”.
这比@TestPropertySource更好,但是我仍然需要在每个Test Class上添加一个注释.我尝试创建一个元注释-should work-因此至少我只有一个自定义注释,可以在其中捆绑其他设置.但这是行不通的.
理想的解决方案是使用一个配置类在全局范围内设置这些设置,而不必在每个测试上都添加注释.
我仍在寻找该解决方案,或者至少在关闭此问题之前调试元注释.编辑:我创建了一个吉拉问题:SPR-17531
编辑
好的,我有些困惑,所以我重新测试了所有不同的组合:
> @TestPropertySource(locations =“ classpath:application-test.properties”)在测试中,现在可以正常使用.嗯
> Test上的@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配置文件.
例如,如果我们定义一个暂存或测试环境,则意味着我们必须定义一个暂存或测试配置文件,然后定义application-staging.properties或application-test.properties.
该环境文件将被加载,并优先于默认属性文件application.properties.请注意,默认文件仍将被加载,只是当发生属性冲突时,特定于环境的属性文件优先,这意味着application-staging.properties或application-test.properties中指定的属性将覆盖application中的属性.属性.
每个测试类都使用自己的配置文件,因此您需要为每个类指定活动配置文件.
您可能还需要关注的另一件事是,您可以通过配置类来模拟服务
@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的实际实现,而是使用模拟的实现.
标签:spring-boot-test,unit-testing,spring-boot,spring,java 来源: https://codeday.me/bug/20191024/1924154.html