Skip to content

Commit b41756b

Browse files
alsinAlexSinuskinDBG
authored andcommitted
Wait for @AfterEach method's VertxTestContext in case a @test method failed
1 parent c9b97c8 commit b41756b

File tree

2 files changed

+61
-3
lines changed

2 files changed

+61
-3
lines changed

src/main/java/io/vertx/junit5/VertxExtension.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,17 @@
1212
package io.vertx.junit5;
1313

1414
import io.vertx.core.Vertx;
15+
import org.junit.jupiter.api.AfterEach;
1516
import org.junit.jupiter.api.Nested;
16-
import org.junit.jupiter.api.extension.*;
17+
import org.junit.jupiter.api.extension.DynamicTestInvocationContext;
18+
import org.junit.jupiter.api.extension.ExtensionContext;
1719
import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
1820
import org.junit.jupiter.api.extension.ExtensionContext.Store;
21+
import org.junit.jupiter.api.extension.InvocationInterceptor;
22+
import org.junit.jupiter.api.extension.ParameterContext;
23+
import org.junit.jupiter.api.extension.ParameterResolutionException;
24+
import org.junit.jupiter.api.extension.ParameterResolver;
25+
import org.junit.jupiter.api.extension.ReflectiveInvocationContext;
1926

2027
import java.lang.reflect.Method;
2128
import java.util.ArrayList;
@@ -164,12 +171,23 @@ public void interceptDynamicTest(Invocation<Void> invocation, DynamicTestInvocat
164171
@Override
165172
public void interceptAfterEachMethod(Invocation<Void> invocation, ReflectiveInvocationContext<Method> invocationContext, ExtensionContext extensionContext) throws Throwable {
166173
invocation.proceed();
167-
joinActiveTestContexts(extensionContext);
174+
joinActiveTestContexts(invocationContext, extensionContext);
168175
}
169176

170177
private void joinActiveTestContexts(ExtensionContext extensionContext) throws Exception {
178+
joinActiveTestContexts(null, extensionContext);
179+
}
180+
181+
private void joinActiveTestContexts(ReflectiveInvocationContext<Method> invocationContext, ExtensionContext extensionContext) throws Exception {
171182
if (extensionContext.getExecutionException().isPresent()) {
172-
return;
183+
final boolean isNotInAfterEachMethod = Optional.ofNullable(invocationContext)
184+
.map(ReflectiveInvocationContext::getExecutable)
185+
.map(executable -> executable.getAnnotation(AfterEach.class))
186+
.isEmpty();
187+
188+
if (isNotInAfterEachMethod) {
189+
return;
190+
}
173191
}
174192

175193
ContextList currentContexts = store(extensionContext).remove(TEST_CONTEXT_KEY, ContextList.class);
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.vertx.junit5.tests;
2+
3+
import io.vertx.core.Vertx;
4+
import io.vertx.junit5.VertxExtension;
5+
import io.vertx.junit5.VertxTestContext;
6+
import org.junit.jupiter.api.AfterAll;
7+
import org.junit.jupiter.api.AfterEach;
8+
import org.junit.jupiter.api.Test;
9+
import org.junit.jupiter.api.extension.ExtendWith;
10+
11+
import java.util.concurrent.atomic.AtomicBoolean;
12+
13+
@ExtendWith({VertxExtension.class})
14+
public class WaitForContextInAfterEachMethodTest {
15+
static final AtomicBoolean afterTestContextAwaited = new AtomicBoolean(false);
16+
17+
@Test
18+
void test(final VertxTestContext context) {
19+
context.failNow(new RuntimeException("Failing test through context"));
20+
}
21+
22+
@AfterAll
23+
static void afterAll(final VertxTestContext context) {
24+
if (afterTestContextAwaited.get()) {
25+
context.completeNow();
26+
} else {
27+
context.failNow(new RuntimeException("afterTest context was not awaited"));
28+
}
29+
}
30+
31+
@AfterEach
32+
void afterTest(final Vertx vertx, final VertxTestContext context) {
33+
vertx.setTimer(100, id -> {
34+
afterTestContextAwaited.set(true);
35+
context.completeNow();
36+
});
37+
38+
}
39+
40+
}

0 commit comments

Comments
 (0)