diff --git a/container/openejb-junit5/pom.xml b/container/openejb-junit5/pom.xml
index 5a0ad0d4b42..63cfdb35342 100644
--- a/container/openejb-junit5/pom.xml
+++ b/container/openejb-junit5/pom.xml
@@ -87,6 +87,7 @@
+ * http://www.apache.org/licenses/LICENSE-2.0 + *
+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.openejb.junit5; + +import jakarta.annotation.Resource; +import jakarta.enterprise.context.Dependent; +import jakarta.inject.Inject; +import org.apache.openejb.junit5.app.MyResourceApp; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +// -Dtomee.application-composer.application=org.apache.openejb.junit5.app.MyResourceApp +@RunWithApplicationComposer(mode = ExtensionMode.PER_JVM) +public class SingleAppComposerResourceInjectionTest { + + @Resource + private MyResourceApp.MyResource myResource; + + @Resource(name = "myResource") + private MyResourceApp.MyResource myResource2; + + @Resource(name = "java:comp/env/myResource") + private MyResourceApp.MyResource myResource3; + + @Inject + private MyResourceApp.MyService service; + + @Inject + private MyResourceApp app; + + @Test + public void testInject() { + // In App.. + assertNotNull(app, "app must not be null"); + assertNotNull(app.getResource(), "app#myResource must not be null"); + assertEquals("value1", app.getResource().getAttr1(), "app#attr1 should equal 'value1'"); + assertEquals("value2", app.getResource().getAttr2(), "app#attr2 should equal 'value2'"); + + // In Service. + assertNotNull(service, "service must not be null"); + assertNotNull(service.getResource(), "service#myResource must not be null"); + assertEquals("value1", service.getResource().getAttr1(), "service#resource#attr1 should equal 'value1'"); + assertEquals("value2", service.getResource().getAttr2(), "service#resource#attr2 should equal 'value2'"); + + // In Test -> TOMEE-4342 + assertNotNull(myResource, "'myResource' in test must not be null"); + assertEquals("value1", myResource.getAttr1(), "myResource#attr1 should equal 'value1'"); + assertEquals("value2", myResource.getAttr2(), "myResource#attr2 should equal 'value2'"); + + assertNotNull(myResource2, "'myResource3' in test must not be null"); + assertEquals("value1", myResource3.getAttr1(), "myResource2#attr1 should equal 'value1'"); + assertEquals("value2", myResource3.getAttr2(), "myResource2#attr2 should equal 'value2'"); + + assertNotNull(myResource3, "'myResource3' in test must not be null"); + assertEquals("value1", myResource3.getAttr1(), "myResource#attr1 should equal 'value1'"); + assertEquals("value2", myResource3.getAttr2(), "myResource#attr2 should equal 'value2'"); + } +} diff --git a/container/openejb-junit5/src/test/java/org/apache/openejb/junit5/app/MyResourceApp.java b/container/openejb-junit5/src/test/java/org/apache/openejb/junit5/app/MyResourceApp.java new file mode 100644 index 00000000000..d0eabb7ecc8 --- /dev/null +++ b/container/openejb-junit5/src/test/java/org/apache/openejb/junit5/app/MyResourceApp.java @@ -0,0 +1,82 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.openejb.junit5.app; + +import jakarta.annotation.Resource; +import org.apache.openejb.jee.EjbJar; +import org.apache.openejb.junit5.SingleAppComposerResourceInjectionTest; +import org.apache.openejb.testing.Application; +import org.apache.openejb.testing.Classes; +import org.apache.openejb.testing.Configuration; +import org.apache.openejb.testing.Module; + +import java.util.Properties; + +@Application +public class MyResourceApp { + + // Note: Adding the test is required for PER_JVM mode, if you want @Resource injections inside of test classes. + @Module + @Classes(cdi = true, value = {SingleAppComposerResourceInjectionTest.class, MyResourceApp.class, MyService.class}) + public EjbJar modules() { + return new EjbJar(); + } + + @Configuration + public Properties config() { + final Properties p = new Properties(); + p.put("myResource", "new://Resource?class-name=org.apache.openejb.junit5.app.MyResourceApp$MyResource" + + "&constructor=attr1, attr2"); + p.put("myResource.attr1", "value1"); + p.put("myResource.attr2", "value2"); + return p; + } + + @Resource(name = "myResource") + private MyResource resource; + + public MyResource getResource() { + return resource; + } + + public static class MyService { + @Resource(name = "myResource") + private MyResource resource; + + public MyResource getResource() { + return resource; + } + } + public static class MyResource { + + private final String attr1; + private final String attr2; + + public MyResource(String attr1, String attr2) { + this.attr1 = attr1; + this.attr2 = attr2; + } + + public String getAttr1() { + return attr1; + } + + public String getAttr2() { + return attr2; + } + } +} diff --git a/docs/application-composer/advanced.adoc b/docs/application-composer/advanced.adoc index c3ec761c7cb..17704963567 100644 --- a/docs/application-composer/advanced.adoc +++ b/docs/application-composer/advanced.adoc @@ -112,3 +112,14 @@ an instance (or Class) implementing `FallbackPropertyInjector`. == @WebResource Allow for web application to add folders containing web resources. + +== Limitations for Single Instance Application Composer + +For a single instance in test suites, test classes must be scanned for +injections to be prepared as any bean. + +Therefore, test classes need to be either added in the `@Classes` +annotation or marked as a CDI bean (`@Dependent`) annotation. + +You can find an example in `SingleAppComposerResourceInjectionTest` +in `openejb-junit5`. \ No newline at end of file