programing

Junit Spring을 실행하는 방법매개 변수화된 JUNit4ClassRunner?

abcjava 2023. 8. 19. 09:42
반응형

Junit Spring을 실행하는 방법매개 변수화된 JUNit4ClassRunner?

다음 코드는 중복으로 인해 유효하지 않습니다.@RunWith주석:

@RunWith(SpringJUnit4ClassRunner.class)
@RunWith(Parameterized.class)
@SpringApplicationConfiguration(classes = {ApplicationConfigTest.class})
public class ServiceTest {
}

하지만 이 두 주석을 어떻게 함께 사용할 수 있을까요?

SpringClassRule 및 SpringMethodRule을 사용할 수 있습니다 - Spring과 함께 제공됨

import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.springframework.test.context.junit4.rules.SpringClassRule;
import org.springframework.test.context.junit4.rules.SpringMethodRule;

@RunWith(Parameterized.class)
@ContextConfiguration(...)
public class MyTest {

    @ClassRule
    public static final SpringClassRule SPRING_CLASS_RULE = new SpringClassRule();

    @Rule
    public final SpringMethodRule springMethodRule = new SpringMethodRule();

    ...

이를 위한 두 가지 이상의 옵션이 있습니다.

  1. http://www.blog.project13.pl/index.php/coding/1077/runwith-junit4-with-both-springjunit4classrunner-and-parameterized/ 팔로우하기

    테스트는 다음과 같이 표시해야 합니다.

     @RunWith(Parameterized.class)
     @ContextConfiguration(classes = {ApplicationConfigTest.class})
     public class ServiceTest {
    
         private TestContextManager testContextManager;
    
         @Before
         public void setUpContext() throws Exception {
             //this is where the magic happens, we actually do "by hand" what the spring runner would do for us,
            // read the JavaDoc for the class bellow to know exactly what it does, the method names are quite accurate though
           this.testContextManager = new TestContextManager(getClass());
           this.testContextManager.prepareTestInstance(this);
         }
         ...
     }
    
  2. 이전 블로그를 기반으로 하지만 일반화된 방식으로 지원을 추가하는 github 프로젝트 https://github.com/mmichaelis/spring-aware-rule, 이 있습니다.

    @SuppressWarnings("InstanceMethodNamingConvention")
    @ContextConfiguration(classes = {ServiceTest.class})
    public class SpringAwareTest {
    
        @ClassRule
        public static final SpringAware SPRING_AWARE = SpringAware.forClass(SpringAwareTest.class);
    
        @Rule
        public TestRule springAwareMethod = SPRING_AWARE.forInstance(this);
    
        @Rule
        public TestName testName = new TestName();
    
        ...
    }
    

그래서 여러분은 접근법 중 하나를 구현하는 기본적인 수업을 가질 수 있습니다. 그리고 그것으로부터 물려받은 모든 테스트를 말입니다.

Junit 4.12에는 Spring 4.2+가 필요 없는 다른 솔루션이 있습니다.

JUNIT 4.12는 매개변수화된 테스트와 스프링 주입을 결합할 수 있는 ParametersRunnerFactory를 도입했습니다.

public class SpringParametersRunnerFactory implements ParametersRunnerFactory {
@Override
  public Runner createRunnerForTestWithParameters(TestWithParameters test) throws InitializationError {
    final BlockJUnit4ClassRunnerWithParameters runnerWithParameters = new BlockJUnit4ClassRunnerWithParameters(test);
    return new SpringJUnit4ClassRunner(test.getTestClass().getJavaClass()) {
      @Override
      protected Object createTest() throws Exception {
        final Object testInstance = runnerWithParameters.createTest();
        getTestContextManager().prepareTestInstance(testInstance);
        return testInstance;
      }
    };
  }
}

공장을 테스트 클래스에 추가하여 테스트 트랜잭션, 더티 컨텍스트 재결합서블릿 테스트와 같은 완전한 Spring 지원을 제공할 수 있습니다.

@UseParametersRunnerFactory(SpringParametersRunnerFactory.class)
@RunWith(Parameterized.class)
@ContextConfiguration(locations = {"/test-context.xml", "/mvc-context.xml"})
@WebAppConfiguration
@Transactional
@TransactionConfiguration
public class MyTransactionalTest {

  @Autowired
  private WebApplicationContext context;

  ...
}

테스트 인스턴스에 매개 변수를 제공하기 위해 @Parameters static 메서드 내의 Spring 컨텍스트가 필요한 경우 여기에서 제 답변을 참조하십시오. Spring을 사용하여 주입되는 필드와 함께 Parameterized Junit 테스트 실행기를 어떻게 사용할 수 있습니까?

애플리케이션 컨텍스트를 직접 처리

제게 효과가 있었던 것은@RunWith(Parameterized.class)응용프로그램 컨텍스트를 "수동으로" 관리한 테스트 클래스입니다.

이를 위해 다음과 같은 문자열 컬렉션을 사용하여 애플리케이션 컨텍스트를 생성했습니다.@ContextConfiguration그래서 가지고 있는 대신에.

@ContextConfiguration(locations = { "classpath:spring-config-file1.xml",
    "classpath:spring-config-file2.xml" })

나는 가지고 있었습니다

ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[] {
            "classpath:spring-config-file1.xml", "classpath:spring-config-file2.xml"  });

그리고 각 @Autowire에 대해 생성된 컨텍스트에서 손으로 가져와야 했습니다.

SomeClass someBean = ctx.getBean("someClassAutowiredBean", SomeClass.class);

마지막에 컨텍스트를 닫는 것을 잊지 마십시오.

((ClassPathXmlApplicationContext) ctx).close();

이 질문은 오래 전에 답변되었지만 저는 저의 대안적인 해결책을 게시하고 싶습니다.

스프링 구성을 그대로 유지했습니다.

@RunWith(SpringRunner.class) @SpringBootTest(클래스 = XXXWebApplication.class)

그리고 주석을 사용하는 대신에@Parameters각 시나리오를 실행하기 위해 테스트를 실행할 때 변수를 전역 배열에 넣고 반복합니다.

가장 간단한.

언급URL : https://stackoverflow.com/questions/28560734/how-to-run-junit-springjunit4classrunner-with-parametrized

반응형