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

기본 속성이 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.



답변

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

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

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

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

}


답변

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


답변

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

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


답변

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

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


답변

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를 참조 하십시오 .


답변

간단한 설명 :

당신이 나 같은과 같은이있는 경우 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;

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

건배


답변

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`