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();
...
이를 위한 두 가지 이상의 옵션이 있습니다.
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); } ... }
이전 블로그를 기반으로 하지만 일반화된 방식으로 지원을 추가하는 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
'programing' 카테고리의 다른 글
Excel 시트의 데이터로 행을 계산하려면 어떻게 해야 합니까? (0) | 2023.08.19 |
---|---|
jQuery를 사용하여 div의 높이가 변경되는 경우 감지 (0) | 2023.08.19 |
표준 웹 양식 .Net에서 JSON 개체를 반환하는 방법 (0) | 2023.08.19 |
각도 물질의 대화 상자에 데이터를 전달하는 방법 2 (0) | 2023.08.19 |
Python에서 사용 가능한 포트 나열 (0) | 2023.08.19 |