[SPRING] 스프링 부트 JUnit 테스트에서 * 자동 구성 클래스를 제외하는 방법?
SPRING스프링 부트 JUnit 테스트에서 * 자동 구성 클래스를 제외하는 방법?
나는 시도했다 :
@RunWith(SpringJUnit4ClassRunner.class)
@EnableAutoConfiguration(exclude=CrshAutoConfiguration.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class LikeControllerTest {
그러나 CRaSSHD는 여전히 시작됩니다. 현재는 테스트에 해를 끼치 지 않지만, 단위 테스트 중에 불필요한 모듈을 비활성화하여 속도를 높이고 잠재적 인 충돌을 피하고자합니다.
해결법
-
==============================
1.나는 스프링 부트 구성 리포지토리를 독립적으로 테스트하기를 원했던 유사한 사용 사례 (나의 테스트에서는 실패한 스프링 보안 자동 설정이없는 경우)를 사용했다. @SpringApplicationConfiguration은 SpringApplicationContextLoader를 사용하며 JavaDoc이 있습니다.
나는 스프링 부트 구성 리포지토리를 독립적으로 테스트하기를 원했던 유사한 사용 사례 (나의 테스트에서는 실패한 스프링 보안 자동 설정이없는 경우)를 사용했다. @SpringApplicationConfiguration은 SpringApplicationContextLoader를 사용하며 JavaDoc이 있습니다.
그러나 필자는 자신과 마찬가지로 기본 구성 입력 지점, 즉 @SpringApplicationConfiguration (classes = Application.class) 접근 방식을 사용하여 리포지토리 계층 만 테스트하도록 테스트를 구성하는 방법을 생각해 낼 수 없습니다.
내 솔루션은 테스트 전용의 완전히 새로운 응용 프로그램 컨텍스트를 만드는 것이 었습니다. src / test / java에는 repo라는 하위 패키지에 두 개의 파일이 있습니다.
RepoIntegrationTest.java가있는 곳
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = TestRepoConfig.class) public class RepoIntegrationTest {
TestRepoConfig.java에는
@SpringBootApplication(exclude = SecurityAutoConfiguration.class) public class TestRepoConfig {
문제가 생기지 만 Spring Boot 팀의 누군가가 대안의 권장 솔루션을 제공 할 수 있다면 정말 유용 할 것입니다.
-
==============================
2.자동 구성 클래스를 제외하는 또 다른 간단한 방법은
자동 구성 클래스를 제외하는 또 다른 간단한 방법은
비슷한 구성을 application.yml 파일에 추가하십시오.
--- spring: profiles: test autoconfigure.exclude: org.springframework.boot.autoconfigure.session.SessionAutoConfiguration
-
==============================
3.비슷한 문제가 있었지만 다른 사람들을 도울 수있는 다른 해결책을 찾았습니다. Spring 프로필을 사용하여 테스트 및 앱 구성 클래스를 구분했습니다.
비슷한 문제가 있었지만 다른 사람들을 도울 수있는 다른 해결책을 찾았습니다. Spring 프로필을 사용하여 테스트 및 앱 구성 클래스를 구분했습니다.
예 :
구성 :
@Profile("test") @Configuration @EnableWebMvc @ComponentScan( basePackages="your.base.package", excludeFilters = { @Filter(type = ASSIGNABLE_TYPE, value = { ExcludedAppConfig1.class, ExcludedAppConfig2.class }) }) public class TestConfig { ...}
테스트:
@ActiveProfiles("test") @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = TestConfig.class) @WebAppConfiguration public class SomeTest{ ... }
-
==============================
4.새로운 @SpringBootTest 어노테이션을 사용하여이 답변을 가져 와서 @SpringBootApplication 구성 클래스로 프로필을 사용하도록 수정했습니다. @Profile 주석은 필 요한 특정 통합 테스트 중에 만이 클래스가 선택되도록하는 데 필 요합니다. 다른 테스트 구성은 다른 구성 요소 스캔을 수행하기 때.입니다.
새로운 @SpringBootTest 어노테이션을 사용하여이 답변을 가져 와서 @SpringBootApplication 구성 클래스로 프로필을 사용하도록 수정했습니다. @Profile 주석은 필 요한 특정 통합 테스트 중에 만이 클래스가 선택되도록하는 데 필 요합니다. 다른 테스트 구성은 다른 구성 요소 스캔을 수행하기 때.입니다.
다음은 구성 클래스입니다.
@Profile("specific-profile") @SpringBootApplication(scanBasePackages={"com.myco.package1", "com.myco.package2"}) public class SpecificTestConfig { }
그런 다음 테스트 클래스는이 구성 클래스를 참조합니다.
@RunWith(SpringRunner.class) @SpringBootTest(classes = { SpecificTestConfig.class }) @ActiveProfiles({"specific-profile"}) public class MyTest { }
-
==============================
5.@SpringApplicationConfiguration을 사용하여 Application 클래스를로드하는 경우 테스트 클래스에서 @EnableAutoConfiguration 주석을 사용하면 작동하지 않는다고 생각합니다. 문제는 이미 CrashAutoConfiguration.Spring을 제외하지 않는 Application 클래스에서 @EnableAutoConfiguration 주석을 가지고 있다는 것입니다. 빈의 자동 구성을 수행하기 위해 테스트 클래스에있는 주석 대신 주석을 사용합니다.
@SpringApplicationConfiguration을 사용하여 Application 클래스를로드하는 경우 테스트 클래스에서 @EnableAutoConfiguration 주석을 사용하면 작동하지 않는다고 생각합니다. 문제는 이미 CrashAutoConfiguration.Spring을 제외하지 않는 Application 클래스에서 @EnableAutoConfiguration 주석을 가지고 있다는 것입니다. 빈의 자동 구성을 수행하기 위해 테스트 클래스에있는 주석 대신 주석을 사용합니다.
최선의 방법은 테스트에 다른 응용 프로그램 컨텍스트를 사용하고 해당 클래스의 자동 설치를 제외하는 것입니다.
몇 가지 테스트를했는데 @SpringApplicationConfiguration 주석과 SpringJUnit4ClassRunner를 사용하는 경우 테스트 클래스의 @EnableAutoConfiguration은 완전히 무시됩니다.
-
==============================
6.
@SpringBootTest(classes = {Application.class} , webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT , properties="spring.autoconfigure.exclude=com.xx.xx.AutoConfiguration" )
ref : https : //github.com/spring-projects/spring-boot/issues/8579
-
==============================
7.같은 종류의 문제가 생겨 시험 중 주 스프링 부트 클래스를 제외 할 수 없었습니다. 다음과 같은 방법으로 해결했습니다.
같은 종류의 문제가 생겨 시험 중 주 스프링 부트 클래스를 제외 할 수 없었습니다. 다음과 같은 방법으로 해결했습니다.
@SpringBootApplication을 사용하는 대신 포함 된 세 개의 주석을 모두 사용하고 @Configuration에 이름을 할당하십시오
@Configuration("myApp") @EnableAutoConfiguration @ComponentScan public class MyApp { .. }
테스트 클래스에서 정확히 동일한 이름을 가진 구성을 정의하십시오.
@RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration // ugly hack how to exclude main configuration @Configuration("myApp") @SpringApplicationConfiguration(classes = MyTest.class) public class MyTest { ... }
도움이 될 것입니다. 구성 주석을 자동으로 검색하지 못하게하는 방법을 사용하는 것이 좋습니다.
-
==============================
8.필자는 이것에 대해서도 고심하고 @ComponentScan 문서에 대한 간단한 읽기 후에 테스트 컨텍스트를 격리하는 간단한 패턴을 발견했습니다.
필자는 이것에 대해서도 고심하고 @ComponentScan 문서에 대한 간단한 읽기 후에 테스트 컨텍스트를 격리하는 간단한 패턴을 발견했습니다.
예
IsolatedTest.java
package com.example.test; @RunWith(SpringJUnit4ClassRunner.class) @ComponentScan(basePackageClasses = {TestDomain.class}) @SpringApplicationConfiguration(classes = IsolatedTest.Config.class) public class IsolatedTest { String expected = "Read the documentation on @ComponentScan"; String actual = "Too lazy when I can just search on Stack Overflow."; @Test public void testSomething() throws Exception { assertEquals(expected, actual); } @ComponentScan(basePackageClasses = {TestDomain.class}) public static class Config { public static void main(String[] args) { SpringApplication.run(Config.class, args); } } } ...
TestDomain.java
package com.example.test; public interface TestDomain { //noop marker }
-
==============================
9.Spring Boot 1.4.x 이상에서이 문제가 발생하면 @OverrideAutoConfiguration (enabled = true)을 사용하여 문제를 해결할 수 있습니다.
Spring Boot 1.4.x 이상에서이 문제가 발생하면 @OverrideAutoConfiguration (enabled = true)을 사용하여 문제를 해결할 수 있습니다.
질문 / 답변과 유사 https://stackoverflow.com/a/39253304/1410035
-
==============================
10.가져 오는 SpringBootApplication / Configuration이 테스트 구성이있는 패키지를 구성 요소로 검색한다는 것이 문제인 경우 실제로 테스트 구성에서 @Configuration 주석을 제거 할 수 있으며 여전히 @SpringBootTest 주석에서 사용할 수 있습니다. 예를 들어, 기본 구성 인 Application 클래스와 모든 테스트는 아니지만 특정 구성에 대한 TestConfiguration 클래스가있는 경우 다음과 같이 클래스를 설정할 수 있습니다.
가져 오는 SpringBootApplication / Configuration이 테스트 구성이있는 패키지를 구성 요소로 검색한다는 것이 문제인 경우 실제로 테스트 구성에서 @Configuration 주석을 제거 할 수 있으며 여전히 @SpringBootTest 주석에서 사용할 수 있습니다. 예를 들어, 기본 구성 인 Application 클래스와 모든 테스트는 아니지만 특정 구성에 대한 TestConfiguration 클래스가있는 경우 다음과 같이 클래스를 설정할 수 있습니다.
@Import(Application.class) //or the specific configurations you want //(Optional) Other Annotations that will not trigger an autowire public class TestConfiguration { //your custom test configuration }
그런 다음 두 가지 방법 중 하나로 테스트를 구성 할 수 있습니다.
-
==============================
11.나는 하루 동안 비슷한 문제로 고심했다 ... 나의 시나리오 :
나는 하루 동안 비슷한 문제로 고심했다 ... 나의 시나리오 :
나는 SpringBoot 응용 프로그램을 가지고 있으며 모든 Spring Bean을 구성하기 위해 scr / main / resources의 applicationContext.xml을 사용합니다. 테스트 (통합 테스트)를 위해 테스트 / 리소스에서 다른 applicationContext.xml을 사용하고 예상했던대로 작동했습니다 : Spring / SpringBoot는 scr / main / resources에서 applicationContext.xml을 덮어 쓰며 구성된 Bean을 포함하는 Testing 용으로 사용합니다 시험용.
그러나 단 하나의 UnitTest에 대해서 테스트에 사용 된 applicationContext.xml에 대한 또 다른 사용자 정의가 필요했습니다.이 테스트에서는 일부 mockito 빈을 사용하려고 했으므로 모의 검증을 할 수있었습니다.
문제는 Spring / SpringBoot가 test / resources의 파일에 동일한 이름이있는 경우에만 scr / main / resources의 applicationContext.xml을 덮어 쓰지 않는다는 것입니다. 나는 몇 시간 동안 다음과 같은 것을 사용하려고 노력했다.
@RunWith(SpringJUnit4ClassRunner.class) @OverrideAutoConfiguration(enabled=true) @ContextConfiguration({"classpath:applicationContext-test.xml"})
그것은 작동하지 않았고, Spring은 먼저 scr / main / resources의 applicationContext.xml에서 빈을로드했다.
@myroch 및 @Stuart의 답변을 기반으로 한 내 솔루션 :
이것은 응용 프로그램에서 사용됩니다.
@SpringBootApplication @Import(MainAppConfig.class) public class SuppressionMain implements CommandLineRunner
이렇게하면이 테스트에서 Spring은 applicationContext.xml을로드하지 않고이 테스트에 대한 사용자 지정 구성 만로드합니다.
from https://stackoverflow.com/questions/26698071/how-to-exclude-autoconfiguration-classes-in-spring-boot-junit-tests by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] JUnit에서 Spring을 사용하여 서비스를 테스트 할 때 데이터베이스 트랜잭션을 롤백하는 방법은 무엇입니까? (0) | 2018.12.18 |
---|---|
[SPRING] Spring : 특정 빈이 먼저 초기화되는지 확인한다. (0) | 2018.12.18 |
[SPRING] 왜 HibernateTemplate이 추천되지 않는가? [복제] (0) | 2018.12.18 |
[SPRING] 스프링 프로토 타입 범위의 싱글 톤 (0) | 2018.12.18 |
[SPRING] Spring 트랜잭션 이해하기 - 트랜잭션 메소드가 다른 트랜잭션 메소드를 호출하면 어떻게 될까? (0) | 2018.12.17 |