Junit Test의 기본 Spring-Boot application.properties 설정 재정의


198

기본 속성이 application.properties클래스 경로 (src / main / resources / application.properties) 의 파일에 설정된 Spring-Boot 응용 프로그램이 있습니다.

test.properties파일에 선언 된 속성 (src / test / resources / test.properties)으로 JUnit 테스트의 일부 기본 설정을 재정의하고 싶습니다.

일반적으로 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 {

}

먼저 @PropertySource("classpath:test.properties")TestConfig 클래스에서 사용 하면 트릭을 수행 할 것이라고 생각했지만 이러한 속성은 application.properties 설정을 덮어 쓰지 않습니다 (Spring-Boot Reference Doc- 23. Externalized Configuration 참조 ).

그런 다음 -Dspring.config.location=classpath:test.properties테스트를 호출 할 때 사용하려고했습니다 . 성공했지만 각 테스트 실행에 대해이 시스템 속성을 설정하고 싶지 않습니다. 따라서 코드에 넣었습니다.

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

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

}

불행히도 다시는 성공하지 못했습니다.

내가 간과해야했던 application.propertiesJUnit 테스트의 설정 을 무시하는 방법에 대한 간단한 해결책이 있어야합니다 test.properties.


몇 가지 속성 만 구성해야하는 경우 새로운 @DynamicPropertySource 주석을 사용할 수 있습니다. stackoverflow.com/a/60941845/8650621
Felipe Desiderati

답변:


293

@TestPropertySource값을 재정의 하는 데 사용할 수 있습니다 application.properties. javadoc에서 :

테스트 특성 소스를 사용하여 시스템 및 애플리케이션 특성 소스에 정의 된 특성을 선택적으로 대체 할 수 있습니다.

예를 들면 다음과 같습니다.

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ExampleApplication.class)
@TestPropertySource(locations="classpath:test.properties")
public class ExampleApplicationTests {

}

2
그게 다야. 감사. 불행히도 ExampleApplication.class에서 사용될 때 작동하지 않으므로 각 테스트 클래스에서 설정해야합니다. 맞습니까?
FrVaBe

1
테스트 클래스의 계층 어딘가에 있어야합니다. 즉, 공통 수퍼 클래스를 사용하여 여러 다른 테스트 클래스에서 구성 할 수 있습니다.
Andy Wilkinson

64
또한 일부 속성을 인라인으로 덮어 쓰는 인수를 @TestPropertySource사용할 수 있습니다 . 완전히 새로운 속성 파일을 원하지 않는 경우에 유용합니다. properties@TestPropertySource(properties = "myConf.myProp=valueInTest")
dyng

2
배열에 여러 파일을 지정하고 파일 시스템에있는 파일을 지정할 수도 있습니다 (그러나 CI 서버에서 작동하지 않을 수도 있음을 기억하십시오) :@TestPropertySource(locations={"file:C:/dev/...","classpath:test.properties"})
Adam

8
참고, @SpringApplicationConfiguration이미 사용되지 않으며 사용한다@SpringBootTest
mrkernelpanic

74

src/test/resources/application.properties다음 주석을 사용하면 스프링 부트가 자동으로로드 됩니다.

@RunWith(SpringRunner.class)
@SpringBootTest

따라서 자동 구성을 사용하도록 이름 test.properties을 바꿉니다 application.properties.

속성 파일을 (환경으로) * 로드 * 해야하는 경우 여기에 설명 된대로 다음을 사용할 수도 있습니다.

@RunWith(SpringRunner.class)
@ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class) 

[ 업데이트 : 테스트를 위해 특정 속성 재정의 ]

  1. 추가하십시오 src/main/resources/application-test.properties.
  2. 로 테스트 클래스에 주석을 답니다 @ActiveProfiles("test").

이 부하 application.properties application-test.properties 정의 된 규칙에 따라 테스트 케이스를위한 애플리케이션 컨텍스트에 등록, 여기 .

데모-https: //github.com/mohnish82/so-spring-boot-testprops


1
확실하지가 두가 좋은 아이디어 인 경우 application.properties클래스 패스에있는 파일 (하나 src/main/resources와 하나를 src/test/resources). 누가 둘 다 찍고 어느 것이 먼저 찍을 것이라고 보증합니까?
FrVaBe

3
@FrVaBe Spring이이를 보장 할 것입니다! 기본 프로필 속성은 항상로드됩니다. 그런 다음 테스트 단계에서 새 / 기존 속성을 추가 / 재정 의하여 테스트 속성이로드됩니다. 당신은 같은 이름을 가진 두 개의 파일을 유지하는 마음에 들지 않으면, 당신은 추가 할 수 있습니다 application-test.propertiessrc/main/resources와 지정 test테스트 케이스에서 활성 프로파일로.
Mohnish

7
봄은 보장하지 않습니다. 빌드 도구는 테스트 중에 기본 리소스를 위해 테스트 리소스를 사용합니다. 그러나 테스트 application.properties의 경우 기본 application.properties가 무시됩니다. 기본 값에는 몇 가지 유용한 기본값이 포함되어 있기 때문에 원하는 것이 아닙니다. 테스트 중 일부만 재정의하면됩니다 (테스트 섹션에서 전체 파일을 복제하고 싶지는 않습니다). 여기를 참조 하십시오 .
FrVaBe

6
맞습니다 src/test/resources/application.properties. 테스트 단계 에서 정의 된 속성 만 로드되고 src/main/resources/application.properties무시됩니다.
Mohnish

11
지금까지 프로파일을 사용하지 않으면 전용 "테스트"프로파일이 필요하지 않습니다. 테스트 속성의 이름을 지정 application-default.properties하면 "기본"프로필이 자동으로 실행되므로 다른 속성 이없는 것으로 간주됩니다.
FrVaBe

65

메타 주석 을 사용 하여 구성을 외부화 할 수도 있습니다 . 예를 들면 다음과 같습니다.

@RunWith(SpringJUnit4ClassRunner.class)
@DefaultTestAnnotations
public class ExampleApplicationTests { 
   ...
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@SpringApplicationConfiguration(classes = ExampleApplication.class)
@TestPropertySource(locations="classpath:test.properties")
public @interface DefaultTestAnnotations { }

21

@SpringBootTest주석을 사용하는 경우 테스트에서 몇 가지 속성을 재정의하는 데 적합한 다른 방법입니다 .

@SpringBootTest(properties = {"propA=valueA", "propB=valueB"})

1
않습니다 SpringBootTestapplication.properties 파일을로드?
TuGordoBello

8

TLDR :

그래서 내가 한 것은 표준 src/main/resources/application.propertiessrc/test/resources/application-default.properties모든 테스트에 대한 일부 설정을 재정의하는 것입니다.

전체 이야기

나는 같은 문제에 부딪 쳤고 지금까지 프로파일을 사용하지 않았습니다. 지금해야 할 일이 귀찮고, 잊어 버릴 수있는 프로파일을 선언하는 것을 기억하십시오.

요령은 프로파일 특정 application-<profile>.properties이 일반 프로파일의 설정을 대체 한다는 것입니다 . https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties를 참조 하십시오 .


3

간단한 설명 :

당신이 나 같은과 같은이있는 경우 application.propertiessrc/main/resources하고 src/test/resources, 그리고 당신이 궁금 왜 ' application.properties테스트 폴더가되지 않는 무시application.properties주요 자원으로 읽어 ...

당신이 application.properties아래에 src/main/resources있고 같은 application.properties아래 src/test/resources에있는 경우 application.properties, 테스트를 실행하는 방법에 달려 있습니다 . 폴더 구조 src/main/resources 와는 src/test/resources, 당신처럼 테스트를 실행 그렇다면, 메이븐 건축 관례 mvnw test또는 gradlew testapplication.properties에서이 src/test/resources같이 집어 얻을 것이다 테스트 클래스 패스가 선행됩니다 주요 클래스 경로를. 이 같은 테스트를 실행한다면, Run as JUnit TestElipse / STS에서의 application.properties에서이 src/main/resources같이 집어 얻을 것이다 주요 클래스 경로에 선행 테스트 클래스 패스.

를 열어서 확인할 수 있습니다 Run > Run Configurations > JUnit > *your_run_configuration* > Click on "Show Command Line".

다음과 같은 것을 보게 될 것입니다 :

XXXbin \ javaw.exe -ea -Dfile.encoding = UTF-8 -classpath XXX \ workspace-spring-tool-suite-4-4.5.1.RELEASE \ project_name \ bin \ main; XXX \ workspace-spring-tool-suite-4-4.5.1.RELEASE \ project_name \ bin \ test;

당신이 볼 수행 주요 \ 먼저, 다음 \ 테스트 ? 맞아, 클래스 패스에 관한 모든 것 :-)

건배


1
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`

1

Spring 5.2.5 및 Spring Boot 2.2.6을 사용하고 있으며 전체 파일 대신 몇 가지 속성 만 재정의하려는 경우. 새로운 주석을 사용할 수 있습니다 : @DynamicPropertySource

@SpringBootTest
@Testcontainers
class ExampleIntegrationTests {

    @Container
    static Neo4jContainer<?> neo4j = new Neo4jContainer<>();

    @DynamicPropertySource
    static void neo4jProperties(DynamicPropertyRegistry registry) {
        registry.add("spring.data.neo4j.uri", neo4j::getBoltUrl);
    }
}

0

그렇지 않으면 기본 속성 구성자 이름을 변경하고 속성을 설정 spring.config.name=test한 다음 src/test/test.properties기본 인스턴스 인 클래스 경로 리소스 org.springframework.boot.SpringApplication를이 분리 된 test.properties에서 자동 구성하여 응용 프로그램 속성을 무시할 수 있습니다.

이점 : 테스트 자동 구성;

단점 : CI 레이어에서 "spring.config.name"속성 노출

심판 : http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

spring.config.name = application # 설정 파일 이름


5
무시는 application.properties난 단지 오버라이드 (override) 할 나를위한 옵션이 아닌 일부 테스트에서 원래 구성 값을.
FrVaBe

src / main / resources / application.properties를로드하지 않는 단일 테스트를 수행하는 방법을 찾고 있습니다. src / test / resources / empty.properties 파일을 작성하고 기본 특성을 무시해야하는 주석을 테스트에 추가하십시오. @TestPropertySource (properties = "spring.config.name = empty")
rvertigo

각 junit 테스트 방법에 대해 특정 속성 값을 설정하는 방법은 무엇입니까?
니콜라스

0

JUnit이 작성된 src / test / resources에 application.properties 파일을 작성할 수도 있습니다.


이것이 어떻게 도움이됩니까? ^^
jumping_monkey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.