데이터베이스와 rabbitmq 사용법이있는 작은 스프링 부팅 응용 프로그램이 있습니다. 그래서 통합 테스트 (H2 + apache qpid)로 테스트하고 싶습니다.@SpringBootTest + @BeforeAll
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = TestSpringConfig.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
내 응용 프로그램으로 시작 @BeforeAll를 사용하여 데이터베이스와 MQ 임 기대 :
@BeforeAll
public void before() {
startMessageBroker();
startDatabase();
}
문제는 내 웹 응용 프로그램은 @BeforeAll에 정의 된 데이터베이스/MQ 전에 시작한다는 것입니다.
org.springframework.test.context.junit.jupiter.SpringExtension :
public class SpringExtension implements BeforeAllCallback, AfterAllCallback, TestInstancePostProcessor,
BeforeEachCallback, AfterEachCallback, BeforeTestExecutionCallback, AfterTestExecutionCallback,
ParameterResolver {
// ...
@Override
public void beforeAll(ExtensionContext context) throws Exception {
getTestContextManager(context).beforeTestClass();
}
// ...
@Override
public void postProcessTestInstance(Object testInstance, ExtensionContext context) throws Exception {
getTestContextManager(context).prepareTestInstance(testInstance);
}
// ...
웹 응용 프로그램은 beforeAll에서 postProcessTestInstance 위상과 @BeforeAll 방법에서 시작됩니다.
org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor :
private void execute(TestDescriptor testDescriptor, C parentContext, ExecutionTracker tracker) {
Node<C> node = asNode(testDescriptor);
tracker.markExecuted(testDescriptor);
C preparedContext;
try {
preparedContext = node.prepare(parentContext); // 1 <<<
SkipResult skipResult = node.shouldBeSkipped(preparedContext);
if (skipResult.isSkipped()) {
this.listener.executionSkipped(testDescriptor, skipResult.getReason().orElse("<unknown>"));
return;
}
}
catch (Throwable throwable) {
rethrowIfBlacklisted(throwable);
// We call executionStarted first to comply with the contract of EngineExecutionListener
this.listener.executionStarted(testDescriptor);
this.listener.executionFinished(testDescriptor, TestExecutionResult.failed(throwable));
return;
}
this.listener.executionStarted(testDescriptor);
TestExecutionResult result = singleTestExecutor.executeSafely(() -> {
C context = preparedContext;
try {
context = node.before(context); // 2 <<<
C contextForDynamicChildren = context;
context = node.execute(context, dynamicTestDescriptor -> {
this.listener.dynamicTestRegistered(dynamicTestDescriptor);
execute(dynamicTestDescriptor, contextForDynamicChildren, tracker);
});
C contextForStaticChildren = context;
// @formatter:off
testDescriptor.getChildren().stream()
.filter(child -> !tracker.wasAlreadyExecuted(child))
.forEach(child -> execute(child, contextForStaticChildren, tracker));
// @formatter:on
}
finally {
node.after(context);
}
});
this.listener.executionFinished(testDescriptor, result);
}
참조 점 1과 2는 '전에'다음 '준비'의 실행하고있다.
확실하지 않은 점은 junit, SpringExtension 또는 Im의 문제입니다. 어떤 조언이 필요합니까?
의 JUnit 목성 : 5.0.1
스프링 시험 : 5.0.0.RELEASE
스프링 부팅 테스트 : 1.5.8.RELEASE
@BeforeAll 메서드는 정적 메서드 – Yogi
이어야합니다. SpringExtension이 응용 프로그램 컨텍스트를 만들 때 의존하는 경우 Spring ['TestExecutionListener'] (https://docs.spring.io/spring/)을 구현하는 것이 좋습니다. docs/current/spring-framework-reference/testing.html # testcontext-tel-config). –