我有一个Spring-Boot应用程序,其中在应用程序中设置了默认属性。属性文件在类路径(src/main/resources/application.properties)。

我想用测试中声明的属性覆盖JUnit测试中的一些默认设置。属性文件(src/test/resources/test. Properties)

我通常为我的Junit测试有一个专用的配置类,例如。

package foo.bar.test;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {

}

我最初认为在TestConfig类中使用@PropertySource("classpath:test.properties")可以达到目的,但是这些属性不会覆盖应用程序。属性设置(参见Spring-Boot参考文档- 23。外部化配置)。

然后我尝试使用-Dspring.config.location=classpath:test。属性。这是成功的——但是我不想为每次测试执行都设置这个系统属性。因此我把它放在代码中

@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {

  static {
    System.setProperty("spring.config.location", "classpath:test.properties");
  }

}

不幸的是,这次也没有成功。

必须有一个简单的解决方案如何覆盖应用程序。使用test在JUnit测试中设置属性。我一定是忽略了这些特性


当前回答

I just configured min as the following :

spring.h2.console.enabled=true
spring.h2.console.path=/h2-console


# changing the name of my data base for testing
spring.datasource.url= jdbc:h2:mem:mockedDB
spring.datasource.username=sa
spring.datasource.password=sa



# in testing i don`t need to know the port

#Feature that determines what happens when no accessors are found for a type
#(and there are no annotations to indicate it is meant to be serialized).
spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false`enter code here`

其他回答

TLDR:

我所做的就是创建标准的src/main/resources/application。属性和src/test/resources/application-default。属性,我覆盖一些设置为我所有的测试。

power-developers:

为了更容易地改变/使用不同的spring配置文件,我现在有一个应用程序默认。它声明了我想要使用的概要文件。 这个文件是不提交的,所以每个开发人员可以选择他/她正在工作的配置文件和需求(例如功能)的激活方式。

spring:
  profiles:
    include:
      - local
      - devlocal
      - wip
#      - kafka@docker

---
spring.profiles: wip
# ... overriding properties 

整个故事

我遇到了同样的问题,到目前为止也没有使用配置文件。现在必须这样做,并记得声明概要文件似乎很麻烦——这很容易忘记。

诀窍在于,利用特定于概要文件的应用程序-<profile>。属性将覆盖常规配置文件中的设置。见https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html # boot-features-external-config-profile-specific-properties。

您可以创建一个弹簧。src/test/resources/META-INF中的factories文件和src/test/java中的EnvironmentPostProcessor Implementation类。 春天。工厂像

# Environment Post Processors
org.springframework.boot.env.EnvironmentPostProcessor=\
com.example.test.YourTestPropertiesConfig

YourTestPropertiesConfig.java像

package com.example.test;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MapPropertySource;

import java.util.HashMap;
import java.util.Map;

public class YourTestPropertiesConfig implements EnvironmentPostProcessor {
    private static final Map<String, Object> testProperties = new HashMap<>();
    private static final Set<String> testPropertiesFile = new HashSet<>();

    static {
    //Add the properties you need to take effect globally in the test directly here.
        testProperties.put("spring.jackson.time-zone", "GMT");
        testPropertiesFile.add("classpath:test.properties");
    }

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        environment.getPropertySources().addFirst(new MapPropertySource("TestProperties", testProperties));
        for (String location : testPropertiesFile) {
            try {
                environment.getPropertySources().addFirst(new ResourcePropertySource(location));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void addProperty(String key, Object value) {
        testProperties.put(key, value);
    }

    public static void addProperty(String location) {
        testPropertiesFile.add(location);
    }
}

这对我来说很管用:

我的测试:

@SpringBootTest
@TestPropertySource(properties = "spring.config.additional-location=classpath:application-test.yml")
class EngineApplicationTests {
    @Test
    void contextLoads() {
    }
}

我的版本:

plugins {
    id 'org.springframework.boot' version '2.7.1'
    id 'io.spring.dependency-management' version '1.0.12.RELEASE'
    id 'java'
}

group = 'com.kubemachine'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

ext {
    set('springCloudVersion', "2021.0.3")
}

我的gradle文件中唯一的测试依赖项:

testImplementation 'org.springframework.boot:spring-boot-starter-test'

我的身材里也有这个。gradle文件:

test {
    useJUnitPlatform()
}

和两个属性文件:

src / main /资源/ application.yml src /测试/资源/ application-test.yml

在这个设置中,应用程序测试。yml绝对只覆盖application.yml中的值。我不需要重复应用程序中的属性值。在application-test.yml。应用程序测试。Yml确实扩展了application.yml。

否则,我们可以更改默认的属性配置器名称,设置属性spring.config.name=test,然后使用类路径资源 src /测试/测试。springapplication的本地实例将从这个分离的测试中自动配置。属性,忽略应用程序属性;

优点:自动配置测试;

缺点:在C.I.层暴露“spring.config.name”属性

裁判:http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

spring.config.name=application #配置文件名

您也可以创建一个应用程序。在src/test/resources中的属性文件中,你的junit是在这里编写的。