From abbb660988cdc99e408d9374549b0d10e66051a5 Mon Sep 17 00:00:00 2001 From: Radoslav Husar Date: Tue, 26 Mar 2024 16:04:48 +0100 Subject: [PATCH] ARQ-2231 Instead of implementing org.junit.jupiter.api.extension.BeforeEachCallback.beforeEach handle events within the interceptor --- .../junit5/ArquillianExtension.java | 44 ++++++++++--------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/junit5/core/src/main/java/org/jboss/arquillian/junit5/ArquillianExtension.java b/junit5/core/src/main/java/org/jboss/arquillian/junit5/ArquillianExtension.java index e63c06979..ba95a0dde 100644 --- a/junit5/core/src/main/java/org/jboss/arquillian/junit5/ArquillianExtension.java +++ b/junit5/core/src/main/java/org/jboss/arquillian/junit5/ArquillianExtension.java @@ -10,9 +10,7 @@ import org.jboss.arquillian.test.spi.TestMethodExecutor; import org.jboss.arquillian.test.spi.TestResult; import org.junit.jupiter.api.extension.AfterAllCallback; -import org.junit.jupiter.api.extension.AfterEachCallback; import org.junit.jupiter.api.extension.BeforeAllCallback; -import org.junit.jupiter.api.extension.BeforeEachCallback; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.api.extension.InvocationInterceptor; import org.junit.jupiter.api.extension.ReflectiveInvocationContext; @@ -23,7 +21,7 @@ import static org.jboss.arquillian.junit5.ContextStore.getContextStore; import static org.jboss.arquillian.junit5.JUnitJupiterTestClassLifecycleManager.getManager; -public class ArquillianExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback, InvocationInterceptor, TestExecutionExceptionHandler { +public class ArquillianExtension implements BeforeAllCallback, AfterAllCallback, InvocationInterceptor, TestExecutionExceptionHandler { public static final String RUNNING_INSIDE_ARQUILLIAN = "insideArquillian"; private static final String CHAIN_EXCEPTION_MESSAGE_PREFIX = "Chain of InvocationInterceptors never called invocation"; @@ -44,22 +42,6 @@ public void afterAll(ExtensionContext context) throws Exception { LifecycleMethodExecutor.NO_OP); } - @Override - public void beforeEach(ExtensionContext context) throws Exception { - getManager(context).getAdaptor().before( - context.getRequiredTestInstance(), - context.getRequiredTestMethod(), - LifecycleMethodExecutor.NO_OP); - } - - @Override - public void afterEach(ExtensionContext context) throws Exception { - getManager(context).getAdaptor().after( - context.getRequiredTestInstance(), - context.getRequiredTestMethod(), - LifecycleMethodExecutor.NO_OP); - } - @Override public void interceptTestTemplateMethod(Invocation invocation, ReflectiveInvocationContext invocationContext, ExtensionContext extensionContext) throws Throwable { if (IS_INSIDE_ARQUILLIAN.test(extensionContext)) { @@ -95,9 +77,21 @@ public void interceptTestMethod(Invocation invocation, ReflectiveInvocatio @Override public void interceptBeforeEachMethod(Invocation invocation, ReflectiveInvocationContext invocationContext, ExtensionContext extensionContext) throws Throwable { + // Instead of implementing org.junit.jupiter.api.extension.BeforeEachCallback.beforeEach handle events within the interceptor if (IS_INSIDE_ARQUILLIAN.test(extensionContext) || isRunAsClient(extensionContext)) { - invocation.proceed(); + // Since the invocation is going to proceed, the invocation must happen within the context of SPI before() + getManager(extensionContext).getAdaptor().before( + extensionContext.getRequiredTestInstance(), + extensionContext.getRequiredTestMethod(), + invocation::proceed); } else { + // Ensure the SPI before() is called, but given that the execution is going to be skipped + getManager(extensionContext).getAdaptor().before( + extensionContext.getRequiredTestInstance(), + extensionContext.getRequiredTestMethod(), + LifecycleMethodExecutor.NO_OP); + + // and ensure that the contract of the org.junit.jupiter.api.extension.InvocationInterceptor will be fulfilled. invocation.skip(); } } @@ -106,8 +100,16 @@ public void interceptBeforeEachMethod(Invocation invocation, public void interceptAfterEachMethod(Invocation invocation, ReflectiveInvocationContext invocationContext, ExtensionContext extensionContext) throws Throwable { if (IS_INSIDE_ARQUILLIAN.test(extensionContext) || isRunAsClient(extensionContext)) { - invocation.proceed(); + getManager(extensionContext).getAdaptor().after( + extensionContext.getRequiredTestInstance(), + extensionContext.getRequiredTestMethod(), + invocation::proceed); } else { + getManager(extensionContext).getAdaptor().after( + extensionContext.getRequiredTestInstance(), + extensionContext.getRequiredTestMethod(), + LifecycleMethodExecutor.NO_OP); + invocation.skip(); } }