编程语言
首页 > 编程语言> > java-Spring Boot:如何在单元测试中覆盖默认属性

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