source

Java Spring Boot Test: 테스트 컨텍스트에서 Java 컨피규레이션클래스를 제외하는 방법

bestscript 2023. 3. 16. 21:35

Java Spring Boot Test: 테스트 컨텍스트에서 Java 컨피규레이션클래스를 제외하는 방법

스프링 부트 기능이 있는 Java 웹 앱을 가지고 있습니다.

테스트를 실행할 때 일부 Java 구성 파일을 제외해야 합니다.

테스트 구성(테스트 실행 시 포함 필요):

@TestConfiguration
@PropertySource("classpath:otp-test.properties")
public class TestOTPConfig { }

실제 가동 구성(테스트 실행 시 제외 필요):

 @Configuration
 @PropertySource("classpath:otp.properties")
 public class OTPConfig { }

테스트 클래스(명시적 설정 클래스 포함):

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestAMCApplicationConfig.class)
public class AuthUserServiceTest { .... }

테스트 구성:

@TestConfiguration
@Import({ TestDataSourceConfig.class, TestMailConfiguration.class, TestOTPConfig.class })
@TestPropertySource("classpath:amc-test.properties")
public class TestAMCApplicationConfig extends AMCApplicationConfig { }

클래스도 있습니다.

@SpringBootApplication
public class AMCApplication { }

테스트 실행 중OTPConfig쓰긴 했지만TestOTPConfig...

어떻게 해야 하죠?

일반적으로 스프링 프로파일을 사용하여 활성 프로파일에 따라 스프링 콩을 포함하거나 제외합니다.상황에 따라 기본적으로 활성화될 수 있는 프로덕션 프로파일과 테스트 프로파일을 정의할 수 있습니다.프로덕션 구성 클래스에서 프로덕션 프로파일을 지정할 수 있습니다.

@Configuration
@PropertySource("classpath:otp.properties")
@Profile({ "production" })
public class OTPConfig {
}

test config 클래스는 테스트프로파일을 지정합니다.

@TestConfiguration
@Import({ TestDataSourceConfig.class, TestMailConfiguration.class,    TestOTPConfig.class })
@TestPropertySource("classpath:amc-test.properties")
@Profile({ "test" })
public class TestAMCApplicationConfig extends AMCApplicationConfig {
}

다음으로 테스트 클래스에서 액티브한 프로파일을 말할 수 있습니다.

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestAMCApplicationConfig.class)
@ActiveProfiles({ "test" })
public class AuthUserServiceTest {
  ....
}

프로젝트를 운영 환경에서 실행할 때 환경 변수를 설정하여 "운영"을 기본 활성 프로파일로 포함합니다.

JAVA_OPTS="-Dspring.profiles.active=production"

물론 실제 가동 시작 스크립트는 Java 환경변수를 설정하기 위해 JAVA_OPTS 이외의 다른 것을 사용할 수도 있지만, 어떻게 해서든 설정해야 합니다.spring.profiles.active.

를 사용할 수도 있습니다.@ConditionalOnProperty다음과 같습니다.

@ConditionalOnProperty(value="otpConfig", havingValue="production")
@Configuration
@PropertySource("classpath:otp.properties")
public class OTPConfig { }

및 테스트의 경우:

@ConditionalOnProperty(value="otpConfig", havingValue="test")
@Configuration
@PropertySource("classpath:otp-test.properties")
public class TestOTPConfig { }

그런 다음 에 지정합니다.main/resources/config/application.yml

otpConfig: production

그리고 당신의 안에test/resources/config/application.yml

otpConfig: test

또, 불필요한 설정을 시뮬레이트 할 수도 있습니다.예를 들어 다음과 같습니다.

@MockBean
private AnyConfiguration conf;

시험 수업에 넣으세요.이렇게 하면 진짜가 되는 것을 피할 수 있을 것이다.AnyConfiguration로드 중입니다.

또, 자동 설정을 제외하는 경우는, 다음의 순서에 따릅니다.

@EnableAutoConfiguration(exclude=CassandraDataAutoConfiguration.class)
public class // ...

테스트 폴더의 "쓸데없는" 미러와 동일한 클래스를 만듭니다. 예를 들어 다음과 같습니다.

src에는 /app/MyConfig.java가 있습니다.

@Configuration을 사용하여 테스트 폴더에 /app/MyConfig.java를 만들고 그 안에 빈 본문을 남깁니다.

테스트 및 로드 중에 프로파일 설정OTPConfig프로파일이 활성화되지 않은 경우에만 해당됩니다.

@Profile("!test")
@Configuration
class OTPConfig { ... }

@SpringBootTest(properties = ["spring.profiles.include=test"])
public class AuthUserServiceTest { .... }

내가 사용하는 가장 쉬운 방법은-

  1. 놓다@ConditionalOnProperty내 주요 소스코드로요.
  2. 그런 다음 테스트빈을 정의하고 테스트 설정의 일부로 추가합니다.이 설정을 메인 테스트클래스로 Import 하거나 다른 방법으로 Import 합니다.이것은 테스트빈을 등록해야 할 경우에만 필요합니다.그 콩이 필요 없다면 다음 단계로 넘어가세요.
  3. src/test/resources 아래의 application.properties에 속성을 추가하여 메인 폴더에 있는 구성 클래스를 사용하지 않도록 설정합니다.

보일라!

하시면 됩니다.@ConditionalOnMissingClass("org.springframework.test.context.junit4.SpringJUnit4ClassRunner")를 선택합니다.SpringJUnit4ClassRunner는 테스트 환경에서만 종료되는 모든 클래스로 대체될 수 있습니다.

언급URL : https://stackoverflow.com/questions/39729752/java-spring-boot-test-how-to-exclude-java-configuration-class-from-test-context