복붙노트

[SPRING] 스프링 부트 JUnit 테스트에서 * 자동 구성 클래스를 제외하는 방법?

SPRING

스프링 부트 JUnit 테스트에서 * 자동 구성 클래스를 제외하는 방법?

나는 시도했다 :

@RunWith(SpringJUnit4ClassRunner.class)
@EnableAutoConfiguration(exclude=CrshAutoConfiguration.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class LikeControllerTest {

그러나 CRaSSHD는 여전히 시작됩니다. 현재는 테스트에 해를 끼치 지 않지만, 단위 테스트 중에 불필요한 모듈을 비활성화하여 속도를 높이고 잠재적 인 충돌을 피하고자합니다.

해결법

  1. ==============================

    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. ==============================

    2.자동 구성 클래스를 제외하는 또 다른 간단한 방법은

    자동 구성 클래스를 제외하는 또 다른 간단한 방법은

    비슷한 구성을 application.yml 파일에 추가하십시오.

    ---
    spring:
      profiles: test
      autoconfigure.exclude: org.springframework.boot.autoconfigure.session.SessionAutoConfiguration
    
  3. ==============================

    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. ==============================

    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. ==============================

    5.@SpringApplicationConfiguration을 사용하여 Application 클래스를로드하는 경우 테스트 클래스에서 @EnableAutoConfiguration 주석을 사용하면 작동하지 않는다고 생각합니다. 문제는 이미 CrashAutoConfiguration.Spring을 제외하지 않는 Application 클래스에서 @EnableAutoConfiguration 주석을 가지고 있다는 것입니다. 빈의 자동 구성을 수행하기 위해 테스트 클래스에있는 주석 대신 주석을 사용합니다.

    @SpringApplicationConfiguration을 사용하여 Application 클래스를로드하는 경우 테스트 클래스에서 @EnableAutoConfiguration 주석을 사용하면 작동하지 않는다고 생각합니다. 문제는 이미 CrashAutoConfiguration.Spring을 제외하지 않는 Application 클래스에서 @EnableAutoConfiguration 주석을 가지고 있다는 것입니다. 빈의 자동 구성을 수행하기 위해 테스트 클래스에있는 주석 대신 주석을 사용합니다.

    최선의 방법은 테스트에 다른 응용 프로그램 컨텍스트를 사용하고 해당 클래스의 자동 설치를 제외하는 것입니다.

    몇 가지 테스트를했는데 @SpringApplicationConfiguration 주석과 SpringJUnit4ClassRunner를 사용하는 경우 테스트 클래스의 @EnableAutoConfiguration은 완전히 무시됩니다.

  6. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    9.Spring Boot 1.4.x 이상에서이 문제가 발생하면 @OverrideAutoConfiguration (enabled = true)을 사용하여 문제를 해결할 수 있습니다.

    Spring Boot 1.4.x 이상에서이 문제가 발생하면 @OverrideAutoConfiguration (enabled = true)을 사용하여 문제를 해결할 수 있습니다.

    질문 / 답변과 유사 https://stackoverflow.com/a/39253304/1410035

  10. ==============================

    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. ==============================

    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을로드하지 않고이 테스트에 대한 사용자 지정 구성 만로드합니다.

  12. from https://stackoverflow.com/questions/26698071/how-to-exclude-autoconfiguration-classes-in-spring-boot-junit-tests by cc-by-sa and MIT license