-
Notifications
You must be signed in to change notification settings - Fork 30
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
@ExplicitParameterInjection is now by default inherited for nested cl…
…asses
- Loading branch information
Showing
7 changed files
with
237 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -22,16 +22,26 @@ | |
import jakarta.enterprise.inject.Default; | ||
|
||
/** | ||
* An annotation used to enforce explicit parameter annotation. When applied, Weld will only attempt to resolve method | ||
* parameters which have qualifiers. In case no qualifier is required for your bean, add the {@link Default} qualifier, see CDI | ||
* specification for in depth explanation on qualifiers. | ||
* An annotation used to enforce explicit parameter annotation. When applied and set to {@code true}, Weld will only attempt to | ||
* resolve method parameters which have qualifiers. In case no qualifier is required for your bean, add the {@link Default} | ||
* qualifier, see CDI specification for in depth explanation on qualifiers. | ||
* | ||
* This annotation can be applied either on test class, in which case it affects parameter injection in all methods, or on | ||
* a method. | ||
* This annotation can be applied either on a test class, in which case it affects parameter injection in all methods, or on | ||
* a test method. | ||
* | ||
* Nested classes inherit the behavior declared by their enclosing class but can re-declare this annotation along with the | ||
* {@link #apply()} parameter to override the behavior. | ||
* | ||
* @author <a href="mailto:[email protected]">Matej Novotny</a> | ||
*/ | ||
@Retention(RetentionPolicy.RUNTIME) | ||
public @interface ExplicitParamInjection { | ||
|
||
/** | ||
* If set to {@code true}, Weld will only attempt to resolve parameters which have CDI qualifier annotations. | ||
* | ||
* @return {@code true} by default; can be explicitly set to {@code false} to make Weld attempt to resolve all parameters | ||
*/ | ||
boolean apply() default true; | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
99 changes: 99 additions & 0 deletions
99
...a/org/jboss/weld/junit5/explicitInjection/ExplicitParameterInjectionNestedClass2Test.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
package org.jboss.weld.junit5.explicitInjection; | ||
|
||
import jakarta.enterprise.inject.Default; | ||
|
||
import org.jboss.weld.junit5.ExplicitParamInjection; | ||
import org.jboss.weld.junit5.WeldJunit5Extension; | ||
import org.junit.jupiter.api.Assertions; | ||
import org.junit.jupiter.api.Nested; | ||
import org.junit.jupiter.api.Test; | ||
import org.junit.jupiter.api.extension.ExtendWith; | ||
|
||
// tests that explicit param injection can work on a class level but not propagate to nested test | ||
@ExtendWith(WeldJunit5Extension.class) | ||
@ExplicitParamInjection(apply = false) | ||
public class ExplicitParameterInjectionNestedClass2Test { | ||
|
||
@Test | ||
public void testParameterResolution(@Default Foo foo, Bar bar, @MyQualifier BeanWithQualifier bean) { | ||
// Bar should be resolved by another extension | ||
Assertions.assertNotNull(bar); | ||
Assertions.assertEquals(Bar.class.getSimpleName(), bar.ping()); | ||
// Foo should be resolved as usual | ||
Assertions.assertNotNull(foo); | ||
Assertions.assertEquals(Foo.class.getSimpleName(), foo.ping()); | ||
// BeanWithQualifier should be resolved | ||
Assertions.assertNotNull(bean); | ||
Assertions.assertEquals(BeanWithQualifier.class.getSimpleName(), bean.ping()); | ||
} | ||
|
||
@Nested | ||
class NestedTestClass { | ||
|
||
@Test | ||
public void testParameterResolution(@Default Foo foo, Bar bar, @MyQualifier BeanWithQualifier bean) { | ||
// Weld will now claim all parameters as beans, even Bar | ||
Assertions.assertNotNull(bar); | ||
Assertions.assertEquals(Bar.class.getSimpleName(), bar.ping()); | ||
// Foo should be resolved as usual | ||
Assertions.assertNotNull(foo); | ||
Assertions.assertEquals(Foo.class.getSimpleName(), foo.ping()); | ||
// BeanWithQualifier should be resolved | ||
Assertions.assertNotNull(bean); | ||
Assertions.assertEquals(BeanWithQualifier.class.getSimpleName(), bean.ping()); | ||
} | ||
|
||
@Nested | ||
class TwiceNestedTestClass1 { | ||
|
||
@Test | ||
public void testParameterResolution(@Default Foo foo, Bar bar, @MyQualifier BeanWithQualifier bean) { | ||
// Bar should be resolved by another extension | ||
Assertions.assertNotNull(bar); | ||
Assertions.assertEquals(Bar.class.getSimpleName(), bar.ping()); | ||
// Foo should be resolved as usual | ||
Assertions.assertNotNull(foo); | ||
Assertions.assertEquals(Foo.class.getSimpleName(), foo.ping()); | ||
// BeanWithQualifier should be resolved | ||
Assertions.assertNotNull(bean); | ||
Assertions.assertEquals(BeanWithQualifier.class.getSimpleName(), bean.ping()); | ||
} | ||
} | ||
|
||
@Nested | ||
@ExplicitParamInjection(apply = true) | ||
@ExtendWith(CustomExtension.class) // TwiceNestedTestClass2 and ThriceNestedClass will both use this | ||
class TwiceNestedTestClass2 { | ||
|
||
@Test | ||
public void testParameterResolution(@Default Foo foo, Bar bar, @MyQualifier BeanWithQualifier bean) { | ||
// Bar should be resolved by another extension | ||
Assertions.assertNotNull(bar); | ||
Assertions.assertEquals(CustomExtension.class.getSimpleName(), bar.ping()); | ||
// Foo should be resolved as usual | ||
Assertions.assertNotNull(foo); | ||
Assertions.assertEquals(Foo.class.getSimpleName(), foo.ping()); | ||
// BeanWithQualifier should be resolved | ||
Assertions.assertNotNull(bean); | ||
Assertions.assertEquals(BeanWithQualifier.class.getSimpleName(), bean.ping()); | ||
} | ||
|
||
@Nested | ||
class ThriceNestedClass { | ||
|
||
@Test | ||
public void testParameterResolution(@Default Foo foo, Bar bar, @MyQualifier BeanWithQualifier bean) { | ||
// Bar should be resolved by another extension | ||
Assertions.assertNotNull(bar); | ||
Assertions.assertEquals(CustomExtension.class.getSimpleName(), bar.ping()); | ||
// Foo should be resolved as usual | ||
Assertions.assertNotNull(foo); | ||
Assertions.assertEquals(Foo.class.getSimpleName(), foo.ping()); | ||
// BeanWithQualifier should be resolved | ||
Assertions.assertNotNull(bean); | ||
Assertions.assertEquals(BeanWithQualifier.class.getSimpleName(), bean.ping()); | ||
} | ||
} | ||
} | ||
} | ||
} |
102 changes: 102 additions & 0 deletions
102
...va/org/jboss/weld/junit5/explicitInjection/ExplicitParameterInjectionNestedClassTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
package org.jboss.weld.junit5.explicitInjection; | ||
|
||
import jakarta.enterprise.inject.Default; | ||
|
||
import org.jboss.weld.junit5.ExplicitParamInjection; | ||
import org.jboss.weld.junit5.WeldJunit5Extension; | ||
import org.junit.jupiter.api.Assertions; | ||
import org.junit.jupiter.api.Nested; | ||
import org.junit.jupiter.api.Test; | ||
import org.junit.jupiter.api.extension.ExtendWith; | ||
|
||
// note that @ExtendWith(CustomExtension.class) has to be on each method separately | ||
// the inheritance of this would otherwise cause failures for ThriceNestedClass where Weld claims all parameters | ||
@ExtendWith(WeldJunit5Extension.class) | ||
@ExplicitParamInjection(apply = true) | ||
public class ExplicitParameterInjectionNestedClassTest { | ||
|
||
@Test | ||
@ExtendWith(CustomExtension.class) | ||
public void testParameterResolution(@Default Foo foo, Bar bar, @MyQualifier BeanWithQualifier bean) { | ||
// Bar should be resolved by another extension | ||
Assertions.assertNotNull(bar); | ||
Assertions.assertEquals(CustomExtension.class.getSimpleName(), bar.ping()); | ||
// Foo should be resolved as usual | ||
Assertions.assertNotNull(foo); | ||
Assertions.assertEquals(Foo.class.getSimpleName(), foo.ping()); | ||
// BeanWithQualifier should be resolved | ||
Assertions.assertNotNull(bean); | ||
Assertions.assertEquals(BeanWithQualifier.class.getSimpleName(), bean.ping()); | ||
} | ||
|
||
@Nested | ||
class NestedTestClass { | ||
|
||
@Test | ||
@ExtendWith(CustomExtension.class) | ||
public void testParameterResolution(@Default Foo foo, Bar bar, @MyQualifier BeanWithQualifier bean) { | ||
// Bar should be resolved by another extension | ||
Assertions.assertNotNull(bar); | ||
Assertions.assertEquals(CustomExtension.class.getSimpleName(), bar.ping()); | ||
// Foo should be resolved as usual | ||
Assertions.assertNotNull(foo); | ||
Assertions.assertEquals(Foo.class.getSimpleName(), foo.ping()); | ||
// BeanWithQualifier should be resolved | ||
Assertions.assertNotNull(bean); | ||
Assertions.assertEquals(BeanWithQualifier.class.getSimpleName(), bean.ping()); | ||
} | ||
|
||
@Nested | ||
class TwiceNestedTestClass1 { | ||
|
||
@Test | ||
@ExtendWith(CustomExtension.class) | ||
public void testParameterResolution(@Default Foo foo, Bar bar, @MyQualifier BeanWithQualifier bean) { | ||
// Bar should be resolved by another extension | ||
Assertions.assertNotNull(bar); | ||
Assertions.assertEquals(CustomExtension.class.getSimpleName(), bar.ping()); | ||
// Foo should be resolved as usual | ||
Assertions.assertNotNull(foo); | ||
Assertions.assertEquals(Foo.class.getSimpleName(), foo.ping()); | ||
// BeanWithQualifier should be resolved | ||
Assertions.assertNotNull(bean); | ||
Assertions.assertEquals(BeanWithQualifier.class.getSimpleName(), bean.ping()); | ||
} | ||
} | ||
|
||
@Nested | ||
@ExplicitParamInjection(apply = false) | ||
class TwiceNestedTestClass2 { | ||
|
||
@Test | ||
public void testParameterResolution(@Default Foo foo, Bar bar, @MyQualifier BeanWithQualifier bean) { | ||
// Bar should be resolved by another extension | ||
Assertions.assertNotNull(bar); | ||
Assertions.assertEquals(Bar.class.getSimpleName(), bar.ping()); | ||
// Foo should be resolved as usual | ||
Assertions.assertNotNull(foo); | ||
Assertions.assertEquals(Foo.class.getSimpleName(), foo.ping()); | ||
// BeanWithQualifier should be resolved | ||
Assertions.assertNotNull(bean); | ||
Assertions.assertEquals(BeanWithQualifier.class.getSimpleName(), bean.ping()); | ||
} | ||
|
||
@Nested | ||
class ThriceNestedClass { | ||
|
||
@Test | ||
public void testParameterResolution(@Default Foo foo, Bar bar, @MyQualifier BeanWithQualifier bean) { | ||
// NOTE: Bar should be Weld again! | ||
Assertions.assertNotNull(bar); | ||
Assertions.assertEquals(Bar.class.getSimpleName(), bar.ping()); | ||
// Foo should be resolved as usual | ||
Assertions.assertNotNull(foo); | ||
Assertions.assertEquals(Foo.class.getSimpleName(), foo.ping()); | ||
// BeanWithQualifier should be resolved | ||
Assertions.assertNotNull(bean); | ||
Assertions.assertEquals(BeanWithQualifier.class.getSimpleName(), bean.ping()); | ||
} | ||
} | ||
} | ||
} | ||
} |