This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/deltaspike.git

commit 4081fd9ad5fab710d6cd27a36f3ec7cbc9f9dbdb
Author: Mark Struberg <[email protected]>
AuthorDate: Mon May 11 13:37:00 2026 +0200

    DELTASPIKE-1366 fix injection lifecycle
    
    final injection has to be done in beforeEach, otherwise we will not be able
    to properly determine the ProjectStage and other settings configured via
    TestControl.
---
 .../testcontrol5/api/junit/CdiTestExtension.java   | 42 ++++++++++++++--------
 1 file changed, 28 insertions(+), 14 deletions(-)

diff --git 
a/deltaspike/modules/test-control5/api/src/main/java/org/apache/deltaspike/testcontrol5/api/junit/CdiTestExtension.java
 
b/deltaspike/modules/test-control5/api/src/main/java/org/apache/deltaspike/testcontrol5/api/junit/CdiTestExtension.java
index b1f6d8027..05808b4d0 100644
--- 
a/deltaspike/modules/test-control5/api/src/main/java/org/apache/deltaspike/testcontrol5/api/junit/CdiTestExtension.java
+++ 
b/deltaspike/modules/test-control5/api/src/main/java/org/apache/deltaspike/testcontrol5/api/junit/CdiTestExtension.java
@@ -50,7 +50,6 @@ import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.enterprise.context.RequestScoped;
 import jakarta.enterprise.context.SessionScoped;
 import jakarta.inject.Singleton;
-import org.junit.jupiter.api.extension.TestInstancePostProcessor;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
@@ -60,6 +59,8 @@ import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Stack;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 import java.util.logging.Handler;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -69,12 +70,12 @@ import java.util.logging.Logger;
  * A JUnit 5 extension to start up with a CDI or embedded JavaEE container.
  */
 public class CdiTestExtension implements BeforeAllCallback, AfterAllCallback,
-                                         BeforeEachCallback, 
AfterEachCallback, ParameterResolver,
-                                         TestInstancePostProcessor
+                                         BeforeEachCallback, 
AfterEachCallback, ParameterResolver
 {
     private static final Logger LOGGER = 
Logger.getLogger(CdiTestExtension.class.getName());
 
     private static final String STORE_KEY_TEST_CONTEXT = "testContext";
+    private static final String STORE_KEY_INJECTED_FLAG = "testInjected";
 
     private static final boolean USE_TEST_CLASS_AS_CDI_BEAN;
     private static final boolean ALLOW_INJECTION_POINT_MANIPULATION;
@@ -88,10 +89,15 @@ public class CdiTestExtension implements BeforeAllCallback, 
AfterAllCallback,
 
     private List<TestStatementDecoratorFactory> statementDecoratorFactories;
 
-    protected ContainerAwareTestContext getClassTestContext(ExtensionContext 
extensionContext)
+    protected static ExtensionContext.Store getStore(ExtensionContext 
extensionContext)
     {
         final ExtensionContext.Namespace namespace = 
ExtensionContext.Namespace.create(CdiTestExtension.class, 
extensionContext.getUniqueId());
-        final ExtensionContext.Store store = 
extensionContext.getStore(namespace);
+        return extensionContext.getStore(namespace);
+    }
+
+    protected ContainerAwareTestContext getClassTestContext(ExtensionContext 
extensionContext)
+    {
+        final ExtensionContext.Store store = getStore(extensionContext);
         return store.getOrComputeIfAbsent(STORE_KEY_TEST_CONTEXT, k ->
             {
                 TestControl testControl = extensionContext.getTestClass()
@@ -122,28 +128,25 @@ public class CdiTestExtension implements 
BeforeAllCallback, AfterAllCallback,
     }
 
 
+
     protected ContainerAwareTestContext getMethodTestContext(ExtensionContext 
methodExtensionContext)
     {
-        final ExtensionContext.Namespace namespace = 
ExtensionContext.Namespace.create(CdiTestExtension.class, 
methodExtensionContext.getUniqueId());
-        final ExtensionContext.Store store = 
methodExtensionContext.getStore(namespace);
+        final ExtensionContext.Store store = getStore(methodExtensionContext);
+
         return store.getOrComputeIfAbsent(STORE_KEY_TEST_CONTEXT, k ->
             {
                 TestControl testControl = 
methodExtensionContext.getTestMethod()
                     .map(cls -> 
cls.getAnnotation(TestControl.class)).orElse(null);
 
-                return new ContainerAwareTestContext(testControl, 
getClassTestContext(methodExtensionContext.getParent().orElse(null)));
+                ContainerAwareTestContext classTestContext = 
getClassTestContext(methodExtensionContext.getParent().orElse(null));
+                return new ContainerAwareTestContext(testControl, 
classTestContext);
             }, ContainerAwareTestContext.class);
     }
 
-    @Override
-    public void postProcessTestInstance(Object testInstance, ExtensionContext 
context) throws Exception
-    {
-        BeanProvider.injectFields(testInstance);
-    }
-
     @Override
     public void beforeEach(ExtensionContext extensionContext) throws Exception
     {
+
         ContainerAwareTestContext currentTestContext = 
getMethodTestContext(extensionContext);
 
         extensionContext.getTestMethod().ifPresent(method ->
@@ -157,6 +160,17 @@ public class CdiTestExtension implements 
BeforeAllCallback, AfterAllCallback,
                     throw ExceptionUtils.throwAsRuntimeException(e);
                 }
             });
+
+        final ExtensionContext.Store store = getStore(extensionContext);
+        final ConcurrentMap<Integer, Boolean> isInjectedMap
+            = store.getOrComputeIfAbsent(STORE_KEY_INJECTED_FLAG, k -> new 
ConcurrentHashMap(), ConcurrentMap.class);
+
+        final int classId = 
System.identityHashCode(extensionContext.getTestInstance());
+        if (!isInjectedMap.containsKey(classId))
+        {
+            
BeanProvider.injectFields(extensionContext.getTestInstance().get());
+            isInjectedMap.putIfAbsent(classId, Boolean.TRUE);
+        }
     }
 
     @Override

Reply via email to