복붙노트

[SPRING] JUnit 테스트 중 Application / CommandLineRunner 클래스 실행 방지

SPRING

JUnit 테스트 중 Application / CommandLineRunner 클래스 실행 방지

TestCase 클래스에 다음과 같은 주석이있는 경우 :

@SpringApplicationConfiguration(classes = {Application.class})

CommandLineRunner 인터페이스를 구현하는 Application.class가 필요한 메소드를 실행하게됩니다.

public void run(String... args) throws Exception

나는 여전히 테스트 환경에서 전체 애플리케이션을 시작하고 싶지 않을 수도 있기 때문에, 이것이 대부분, 원하지 않는 행동이라고 생각한다.

이 문제를 우회하는 두 가지 해결책을 염두에 둡니다.

이 솔루션은 모두 많은 코딩 작업을 필요로합니다. 더 편리한 솔루션이 있습니까?

해결법

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

    1.1 월의 솔루션을 쉽게 얻을 수 있습니다.

    1 월의 솔루션을 쉽게 얻을 수 있습니다.

    테스트 클래스에서 "테스트"프로파일을 활성화하십시오.

    @RunWith(SpringJUnit4ClassRunner.class)
    @ActiveProfiles("test")
    public class MyFancyTest {}
    

    CommandLineRunner에서 프로파일을 NOT 테스트로 설정하십시오.

    @Component
    @Profile("!test")
    public class JobCommandLineRunner implements CommandLineRunner {}
    

    그런 다음 응용 프로그램에서 수동으로 프로파일을 설정할 필요가 없습니다.

  2. ==============================

    2.스프링 문서에서 언급했듯이 http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html에서 @ContextConfiguration을 특별한 이니셜 라이저와 함께 사용할 수 있습니다 :

    스프링 문서에서 언급했듯이 http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html에서 @ContextConfiguration을 특별한 이니셜 라이저와 함께 사용할 수 있습니다 :

    이 예제에서 anyComponent는 초기화되고 속성은 주입되지만 run (args) 메소드는 실행되지 않습니다. (Application.class는 내 메인 스프링 진입 지점)

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = Application.class, 
                          initializers = ConfigFileApplicationContextInitializer.class)
    public class ExtractorTest {
        @Autowired
        AnyComponent anyComponent;
    
        @Test
        public void testAnyComponent() {
           anyComponent.anyMethod(anyArgument);
        }
    }
    
  3. ==============================

    3.CommandLineRunner를 구현하는 Bean을 제외한다는 점을 제외하면 완전히 똑같은 응용 프로그램과 동일한 패키지에서 테스트 구성을 정의 할 수 있습니다. 여기서 핵심은 @ ComponentScan.excludeFilters입니다.

    CommandLineRunner를 구현하는 Bean을 제외한다는 점을 제외하면 완전히 똑같은 응용 프로그램과 동일한 패키지에서 테스트 구성을 정의 할 수 있습니다. 여기서 핵심은 @ ComponentScan.excludeFilters입니다.

    @Configuration
    @ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = CommandLineRunner.class))
    @EnableAutoConfiguration
    public class TestApplicationConfiguration {
    }
    

    그런 다음 테스트의 구성을 바꿉니다.

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = TestApplicationConfiguration.class)
    public class SomeApplicationTest {
        ...
    }
    

    CommandLineRunner는 구성의 일부가 아니기 때문에 지금 실행되지 않습니다.

  4. ==============================

    4.나는 파티에 좀 늦었지만 콩을 @ConditionalOnProperty로 표시하는 것이 합리적이다.

    나는 파티에 좀 늦었지만 콩을 @ConditionalOnProperty로 표시하는 것이 합리적이다.

    @ConditionalOnProperty(prefix = "job.autorun", name = "enabled", havingValue = "true", matchIfMissing = true)
    public CommandLineRunner myRunner() {...}
    

    다음 주석은 테스트에서 비활성화됩니다.

    @SpringBootTest(properties = {"job.autorun.enabled=false"})
    
  5. ==============================

    5.이전 답변이 나에게 도움이되지 않았습니다. 다른 프로필 (예 : Spring Boot의 init 메서드)을 사용하여 종료되었습니다.

    이전 답변이 나에게 도움이되지 않았습니다. 다른 프로필 (예 : Spring Boot의 init 메서드)을 사용하여 종료되었습니다.

    SpringApplication app = new SpringApplication(AppConfig.class);
    app.setAdditionalProfiles("production");
    app.run(args);
    

    테스트 도중 실행되지 않으므로 여기에서 안전합니다.

    모든 테스트에는 "테스트"라는 자체 프로파일이 있습니다 (다른 많은 방법에서도 유용합니다).

    @RunWith(SpringJUnit4ClassRunner.class)
    @ActiveProfiles("test")
    public class MyFancyTest {}
    

    명령 줄 러너는 "프로덕션"프로필로 주석을 달아 테스트에서 무시합니다.

    @Component
    @Profile("production")
    public class JobCommandLineRunner implements CommandLineRunner {}
    
  6. ==============================

    6.CommandLineRunner를 구현하지 않으면이 문제를 해결할 수 있습니다. 컨텍스트에서 bean을 가져 와서 argv를 전달하면서 메소드를 호출하십시오. 그러면 같은 결과가 나올 것이며 응용 프로그램은 테스트를 실행할 때 자동으로 시작되지 않습니다.

    CommandLineRunner를 구현하지 않으면이 문제를 해결할 수 있습니다. 컨텍스트에서 bean을 가져 와서 argv를 전달하면서 메소드를 호출하십시오. 그러면 같은 결과가 나올 것이며 응용 프로그램은 테스트를 실행할 때 자동으로 시작되지 않습니다.

  7. ==============================

    7.mocking 프레임 워크가 설치되어 있다면 (예 : MockMVC) CommandLineRunner 구현의 모의 인스턴스를 만들 수 있습니다.

    mocking 프레임 워크가 설치되어 있다면 (예 : MockMVC) CommandLineRunner 구현의 모의 인스턴스를 만들 수 있습니다.

    @MockBean 개인용 TextProcessor myProcessor;

  8. from https://stackoverflow.com/questions/29344313/prevent-application-commandlinerunner-classes-from-executing-during-junit-test by cc-by-sa and MIT license