programing

기능: @RunWith(Spring)JUNIT4ClassRunner.class)

sourcetip 2023. 9. 9. 22:42
반응형

기능: @RunWith(Spring)JUNIT4ClassRunner.class)

이 주석은 어떤 역할을 합니까?
언제 사용하고 싶은데요?
제가 언제 그것을 사용하고 싶지 않겠습니까?

@RunWith(SpringJUnit4ClassRunner.class)

Google을 검색해도 이 주석이 사용자에게 전달해야 할 내용이나 사용 시기/이유에 대한 101가지 설명을 찾을 수 없을 때 더 많은 사용 방법을 찾을 수 있습니다.

주석은 Spring의 종속성 주입이 필요한 단위 테스트를 구성하는 데 사용됩니다.

Spring Reference - 장치 테스트:

10.1 단위 테스트 클래스 생성

장치 테스트에서 배치 작업을 실행하려면 프레임워크에서 작업의 ApplicationContext를 로드해야 합니다.이를 트리거하는 데 두 가지 주석이 사용됩니다.

@Run With(스프링)JUNIT4ClassRunner.class):클래스가 Spring의 JUNit 설비를 사용해야 함을 나타냅니다.

@ContextConfiguration(위치 = {...}): ApplicationContext를 포함하는 XML 파일을 나타냅니다.

XML 파일이 아닌 주석을 사용하는 경우 Spring 종속성 주입이 필요한 단위 테스트 중인 클래스를@ContextConfiguration주석.예를 들어,

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = FooManager.class)
class FooManagerTest {
    
    @Autowired
    FooManager fooManager;

이제 사용할 때fooManager유닛 테스트에서는 스프링 컨텍스트를 설정할 수 있습니다.

한다면fooManager어떤 콩에도 자동 와이어가 있고 그 콩의 클래스 또한 필요합니다.@ContextConfiguration주석.그래서 만약에fooManagera의 자동차 전선.FooReporter콩:

@ContextConfiguration(classes = {FooManager.class, FooReporter.class})

만약 콩들이 그것을fooManager자동 와이어가 용기 상태에 있으면 각 검정에 대해 해당 콩의 상태를 재설정할 수 있습니다.그런 경우에 당신은 다음을 추가할 수 있습니다.@DirtiesContext테스트 클래스 주석:

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)

한다면fooManager또는 자동으로 연결된 콩이 Spring config를 읽고 추가해야 합니다.initializers에 열거하다@ContextConfiguration주석, 그것은 다음을 포함합니다.ConfigFileApplicationContextInitializer클래스:

@ContextConfiguration(classes = {FooManager.class, FooReporter.class}, initializers = ConfigFileApplicationContextInitializer.class)

질문의 일부로 사용하고 싶지 않은 경우에 대답하는 것입니다.

스프링 사용시기JUNIT4 클래스 러너

IMO 스프링JUNIT4ClassRunner는 매우 적게 사용해야 합니다.장치 테스트를 실행하기 위해 Spring 컨테이너를 시작하는 데는 상당한 오버헤드가 수반됩니다.

저는 봄을 주로 사용합니다.테스트할 Junit4ClassRunner:

  • 구성 요소가 예상대로 주입(자동 배선)되는지 여부
  • 해당 구성 데이터가 예상대로 주입됩니다.

부품을 주입할 때 다음과 같은 문제가 발생할 수 있습니다.@Qualifier주석이 잘못 사용되거나 잘못 사용되지 않습니다.

여러 yaml 파일에서 구성을 로드할 때 맵이 예상대로 병합되고 있으며 적절한 재정의가 발생하는지 테스트할 수 있습니다.

적어도 나는 항상 소박한 봄을 가지고 있습니다.JUNIT4ClassRunner 테스트를 통해 Spring 컨테이너가 정상적으로 시동되는지 확인합니다.

스프링을 사용하지 않을 때JUNIT4 클래스 러너

봄을 사용하지 않을 것입니다.JUNIT4ClassRunner는 테스트 중인 내 코드에서 스프링과 관련이 없는 기능을 테스트합니다.제 경험으로는 대부분의 기능을 의미합니다.

따라서 자동 배선된 구성 요소와 주입된 구성 데이터는 무시해야 합니다.이는 장치 테스트에 대한 설정 코드가 상당히 많다는 것을 의미합니다.그러나 이 설정 코드는 테스트 중인 클래스의 모든 테스트에 대해 한 번만 작성하면 됩니다.모의 구성요소를 사용하여 단위 테스트를 실행하는 것도 훨씬 빠릅니다.

저는 조롱을 단순하게 유지하고 스팍을 사용하여 구성 요소를 조롱합니다.그루비 코드 예시:

import spock.lang.Specification

class FooManagerTest extends Specification {

  FooManager cut

  void createMockFooReporter() {
    FooReporter mockFooReporter = Mock(FooReporter)
    mockFooReporter.fooFormatter = Mock(FooFormatter)
  }

  void setup() {
    cut = new FooManager()
    cut.fooReporter = createMockFooReporter()
  }

  void "Basic test"() {
     // Do a basic test using 'cut'
  }

}

에서는 테스트 에서는 인 를 를 인 FooManager자동 와이어가 있습니다.FooReporter가동다고를그n다고hs를tfw그가동FooFormatter.

@RunWith 주석은 봄의 맥락을 초기화하기 위한 것이라고 생각합니다.junit5가 출시되어 @Spring으로 교체만 가능합니다.JUNITConfig.그런데 @RunWith 주석은 이미 @ExtendWith로 대체되었지만 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/25317009/what-does-this-do-runwithspringjunit4classrunner-class

반응형