Skip to content

Commit

Permalink
TOMEE-4342 - ApplicationComposer in PER_JVM should be able to inject @…
Browse files Browse the repository at this point in the history
…resource into test (#1167)
  • Loading branch information
rzo1 authored May 26, 2024
1 parent e5c694c commit 6e21a76
Show file tree
Hide file tree
Showing 4 changed files with 187 additions and 0 deletions.
20 changes: 20 additions & 0 deletions container/openejb-junit5/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@
<excludes>
<exclude>org/apache/openejb/junit5/SingleAppComposerTest</exclude>
<exclude>org/apache/openejb/junit5/SingleAppComposerJVMTest</exclude>
<exclude>org/apache/openejb/junit5/SingleAppComposerResourceInjectionTest</exclude>
</excludes>
</configuration>
</execution>
Expand All @@ -111,6 +112,25 @@
</argLine>
</configuration>
</execution>
<execution>
<id>per-jvm-with-resource-tests</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<forkCount>1</forkCount>
<reuseForks>true</reuseForks>
<includes>
<include>org/apache/openejb/junit5/SingleAppComposerResourceInjectionTest</include>
</includes>
<argLine>
${jacocoArgLine}
-enableassertions
-Dtomee.application-composer.application=org.apache.openejb.junit5.app.MyResourceApp
</argLine>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/**
* 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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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'");
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
}
11 changes: 11 additions & 0 deletions docs/application-composer/advanced.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -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`.

0 comments on commit 6e21a76

Please sign in to comment.