복붙노트

[SPRING] 매개 변수가있는 JUnit SpringJUnit4ClassRunner를 실행하는 방법

SPRING

매개 변수가있는 JUnit SpringJUnit4ClassRunner를 실행하는 방법

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

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

하지만이 두 주석을 함께 사용하려면 어떻게해야합니까?

해결법

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

    1.적어도 2 가지 옵션이 있습니다.

    적어도 2 가지 옵션이 있습니다.

    그래서 당신은 하나의 접근법을 구현하는 기본 클래스와 그것을 기반으로하는 모든 테스트를 가질 수 있습니다.

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

    2.SpringClassRule과 SpringMethodRule을 사용할 수있다. Spring과 함께 제공된다.

    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();
    
        ...
    
  3. ==============================

    3.JUnit 4.12에는 Spring 4.2 이상이 필요없는 또 다른 솔루션이 있습니다.

    JUnit 4.12에는 Spring 4.2 이상이 필요없는 또 다른 솔루션이 있습니다.

    JUnit 4.12에서는 매개 변수화 된 테스트와 Spring injection을 결합 할 수있는 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 정적 메서드 내부에 Spring 컨텍스트가 필요한 경우 여기에서 내 대답을 참조하십시오. Spring을 사용하여 주입 된 필드에 Parameterized JUnit 테스트 러너를 사용하려면 어떻게해야합니까?

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

    4.나에게 효과가 있었던 것은 "손으로"응용 프로그램 컨텍스트를 관리하는 @RunWith (Parameterized.class) 테스트 클래스를 갖는 것이었다.

    나에게 효과가 있었던 것은 "손으로"응용 프로그램 컨텍스트를 관리하는 @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"  });
    

    그리고 각 @Autowired에 대해 필자는 작성된 컨텍스트에서 수동으로 가져 왔습니다.

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

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

    ((ClassPathXmlApplicationContext) ctx).close();
    
  5. from https://stackoverflow.com/questions/28560734/how-to-run-junit-springjunit4classrunner-with-parametrized by cc-by-sa and MIT license