Infra JUnit Jupiter Testing Annotations
The following annotations are supported when used in conjunction with the
InfraExtension
and JUnit Jupiter
(that is, the programming model in JUnit 5):
@JUnitConfig
@JUnitConfig
is a composed annotation that combines
@ExtendWith(InfraExtension.class)
from JUnit Jupiter with @ContextConfiguration
from
the Infra TestContext Framework. It can be used at the class level as a drop-in
replacement for @ContextConfiguration
. With regard to configuration options, the only
difference between @ContextConfiguration
and @JUnitConfig
is that component
classes may be declared with the value
attribute in @JUnitConfig
.
The following example shows how to use the @JUnitConfig
annotation to specify a
configuration class:
-
Java
@JUnitConfig(TestConfig.class) (1)
class ConfigurationClassJUnitJupiterInfraTests {
// class body...
}
1 | Specify the configuration class. |
The following example shows how to use the @JUnitConfig
annotation to specify the
location of a configuration file:
-
Java
@JUnitConfig(locations = "/test-config.xml") (1)
class XmlJUnitJupiterInfraTests {
// class body...
}
1 | Specify the location of a configuration file. |
See Context Management as well as the javadoc for
@JUnitConfig
and @ContextConfiguration
for further details.
@JUnitWebConfig
@JUnitWebConfig
is a composed annotation that combines
@ExtendWith(InfraExtension.class)
from JUnit Jupiter with @ContextConfiguration
and
@WebAppConfiguration
from the Infra TestContext Framework. You can use it at the class
level as a drop-in replacement for @ContextConfiguration
and @WebAppConfiguration
.
With regard to configuration options, the only difference between @ContextConfiguration
and @JUnitWebConfig
is that you can declare component classes by using the
value
attribute in @JUnitWebConfig
. In addition, you can override the value
attribute from @WebAppConfiguration
only by using the resourcePath
attribute in
@JUnitWebConfig
.
The following example shows how to use the @JUnitWebConfig
annotation to specify
a configuration class:
-
Java
@JUnitWebConfig(TestConfig.class) (1)
class ConfigurationClassJUnitJupiterInfraWebTests {
// class body...
}
1 | Specify the configuration class. |
The following example shows how to use the @JUnitWebConfig
annotation to specify the
location of a configuration file:
-
Java
@JUnitWebConfig(locations = "/test-config.xml") (1)
class XmlJUnitJupiterInfraWebTests {
// class body...
}
1 | Specify the location of a configuration file. |
See Context Management as well as the javadoc for
@JUnitWebConfig
,
@ContextConfiguration
, and
@WebAppConfiguration
for further details.
@TestConstructor
@TestConstructor
is a type-level annotation that is used to configure how the parameters
of a test class constructor are autowired from components in the test’s
ApplicationContext
.
If @TestConstructor
is not present or meta-present on a test class, the default test
constructor autowire mode will be used. See the tip below for details on how to change
the default mode. Note, however, that a local declaration of @Autowired
,
@jakarta.inject.Inject
, or @javax.inject.Inject
on a constructor takes precedence
over both @TestConstructor
and the default mode.
Changing the default test constructor autowire mode
The default test constructor autowire mode can be changed by setting the
As of TODAY Framework 5.3, the default mode may also be configured as a JUnit Platform configuration parameter. If the |
As of TODAY Framework 5.2, @TestConstructor is only supported in conjunction
with the InfraExtension for use with JUnit Jupiter. Note that the InfraExtension is
often automatically registered for you – for example, when using annotations such as
@JUnitConfig and @JUnitWebConfig or various test-related annotations from
Infra App Test.
|
@NestedTestConfiguration
@NestedTestConfiguration
is a type-level annotation that is used to configure how
Infra test configuration annotations are processed within enclosing class hierarchies
for inner test classes.
If @NestedTestConfiguration
is not present or meta-present on a test class, in its
supertype hierarchy, or in its enclosing class hierarchy, the default enclosing
configuration inheritance mode will be used. See the tip below for details on how to
change the default mode.
Changing the default enclosing configuration inheritance mode
The default enclosing configuration inheritance mode is |
The Infra TestContext Framework honors @NestedTestConfiguration
semantics for the
following annotations.
The use of @NestedTestConfiguration typically only makes sense in conjunction
with @Nested test classes in JUnit Jupiter; however, there may be other testing
frameworks with support for Infra and nested test classes that make use of this
annotation.
|
See @Nested
test class configuration for an example and further
details.
@EnabledIf
@EnabledIf
is used to signal that the annotated JUnit Jupiter test class or test method
is enabled and should be run if the supplied expression
evaluates to true
.
Specifically, if the expression evaluates to Boolean.TRUE
or a String
equal to true
(ignoring case), the test is enabled. When applied at the class level, all test methods
within that class are automatically enabled by default as well.
Expressions can be any of the following:
-
Infra Expression Language (SpEL) expression. For example:
@EnabledIf("#{systemProperties['os.name'].toLowerCase().contains('mac')}")
-
Placeholder for a property available in the Infra
Environment
. For example:@EnabledIf("${smoke.tests.enabled}")
-
Text literal. For example:
@EnabledIf("true")
Note, however, that a text literal that is not the result of dynamic resolution of a
property placeholder is of zero practical value, since @EnabledIf("false")
is
equivalent to @Disabled
and @EnabledIf("true")
is logically meaningless.
You can use @EnabledIf
as a meta-annotation to create custom composed annotations. For
example, you can create a custom @EnabledOnMac
annotation as follows:
-
Java
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@EnabledIf(
expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
reason = "Enabled on Mac OS"
)
public @interface EnabledOnMac {}
|
Since JUnit 5.7, JUnit Jupiter also has a condition annotation named |
@DisabledIf
@DisabledIf
is used to signal that the annotated JUnit Jupiter test class or test
method is disabled and should not be run if the supplied expression
evaluates to
true
. Specifically, if the expression evaluates to Boolean.TRUE
or a String
equal
to true
(ignoring case), the test is disabled. When applied at the class level, all
test methods within that class are automatically disabled as well.
Expressions can be any of the following:
-
Infra Expression Language (SpEL) expression. For example:
@DisabledIf("#{systemProperties['os.name'].toLowerCase().contains('mac')}")
-
Placeholder for a property available in the Infra
Environment
. For example:@DisabledIf("${smoke.tests.disabled}")
-
Text literal. For example:
@DisabledIf("true")
Note, however, that a text literal that is not the result of dynamic resolution of a
property placeholder is of zero practical value, since @DisabledIf("true")
is
equivalent to @Disabled
and @DisabledIf("false")
is logically meaningless.
You can use @DisabledIf
as a meta-annotation to create custom composed annotations. For
example, you can create a custom @DisabledOnMac
annotation as follows:
-
Java
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@DisabledIf(
expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
reason = "Disabled on Mac OS"
)
public @interface DisabledOnMac {}
|
Since JUnit 5.7, JUnit Jupiter also has a condition annotation named |