Browse Source

Improve formatting for test annotations in reference manual

pull/1076/head
Sam Brannen 10 years ago
parent
commit
f0451294de
  1. 445
      src/asciidoc/testing.adoc

445
src/asciidoc/testing.adoc

@ -331,24 +331,17 @@ you can use in your unit and integration tests in conjunction with the TestConte
framework. Refer to the corresponding javadocs for further information, including framework. Refer to the corresponding javadocs for further information, including
default attribute values, attribute aliases, and so on. default attribute values, attribute aliases, and so on.
* `@ContextConfiguration` ===== @ContextConfiguration
`@ContextConfiguration` defines class-level metadata that is used to determine how to
+ load and configure an `ApplicationContext` for integration tests. Specifically,
`@ContextConfiguration` declares the application context resource `locations` or the
Defines class-level metadata that is used to determine how to load and configure an annotated `classes` that will be used to load the context.
`ApplicationContext` for integration tests. Specifically, `@ContextConfiguration`
declares the application context resource `locations` or the annotated `classes`
that will be used to load the context.
+
Resource locations are typically XML configuration files or Groovy scripts located in Resource locations are typically XML configuration files or Groovy scripts located in
the classpath; whereas, annotated classes are typically `@Configuration` classes. However, the classpath; whereas, annotated classes are typically `@Configuration` classes. However,
resource locations can also refer to files and scripts in the file system, and annotated resource locations can also refer to files and scripts in the file system, and annotated
classes can be component classes, etc. classes can be component classes, etc.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@ -358,8 +351,6 @@ classes can be component classes, etc.
} }
---- ----
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@ -369,13 +360,9 @@ classes can be component classes, etc.
} }
---- ----
+
As an alternative or in addition to declaring resource locations or annotated classes, As an alternative or in addition to declaring resource locations or annotated classes,
`@ContextConfiguration` may be used to declare `ApplicationContextInitializer` classes. `@ContextConfiguration` may be used to declare `ApplicationContextInitializer` classes.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@ -385,15 +372,11 @@ As an alternative or in addition to declaring resource locations or annotated cl
} }
---- ----
+
`@ContextConfiguration` may optionally be used to declare the `ContextLoader` strategy `@ContextConfiguration` may optionally be used to declare the `ContextLoader` strategy
as well. Note, however, that you typically do not need to explicitly configure the as well. Note, however, that you typically do not need to explicitly configure the
loader since the default loader supports either resource `locations` or annotated loader since the default loader supports either resource `locations` or annotated
`classes` as well as `initializers`. `classes` as well as `initializers`.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@ -403,8 +386,6 @@ loader since the default loader supports either resource `locations` or annotate
} }
---- ----
+
[NOTE] [NOTE]
==== ====
`@ContextConfiguration` provides support for __inheriting__ resource locations or `@ContextConfiguration` provides support for __inheriting__ resource locations or
@ -412,24 +393,18 @@ configuration classes as well as context initializers declared by superclasses b
default. default.
==== ====
+
See <<testcontext-ctx-management>> and the `@ContextConfiguration` javadocs for See <<testcontext-ctx-management>> and the `@ContextConfiguration` javadocs for
further details. further details.
* `@WebAppConfiguration` ===== @WebAppConfiguration
`@WebAppConfiguration` is a class-level annotation that is used to declare that the
+ `ApplicationContext` loaded for an integration test should be a `WebApplicationContext`.
The mere presence of `@WebAppConfiguration` on a test class ensures that a
A class-level annotation that is used to declare that the `ApplicationContext` loaded `WebApplicationContext` will be loaded for the test, using the default value of
for an integration test should be a `WebApplicationContext`. The mere presence of `"file:src/main/webapp"` for the path to the root of the web application (i.e., the
`@WebAppConfiguration` on a test class ensures that a `WebApplicationContext` will be __resource base path__). The resource base path is used behind the scenes to create a
loaded for the test, using the default value of `"file:src/main/webapp"` for the path to `MockServletContext` which serves as the `ServletContext` for the test's
the root of the web application (i.e., the __resource base path__). The resource base `WebApplicationContext`.
path is used behind the scenes to create a `MockServletContext` which serves as the
`ServletContext` for the test's `WebApplicationContext`.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
@ -441,14 +416,10 @@ path is used behind the scenes to create a `MockServletContext` which serves as
} }
---- ----
+
To override the default, specify a different base resource path via the __implicit__ To override the default, specify a different base resource path via the __implicit__
`value` attribute. Both `classpath:` and `file:` resource prefixes are supported. If no `value` attribute. Both `classpath:` and `file:` resource prefixes are supported. If no
resource prefix is supplied the path is assumed to be a file system resource. resource prefix is supplied the path is assumed to be a file system resource.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@ -459,26 +430,17 @@ resource prefix is supplied the path is assumed to be a file system resource.
} }
---- ----
+
Note that `@WebAppConfiguration` must be used in conjunction with Note that `@WebAppConfiguration` must be used in conjunction with
`@ContextConfiguration`, either within a single test class or within a test class `@ContextConfiguration`, either within a single test class or within a test class
hierarchy. See the `@WebAppConfiguration` javadocs for further details. hierarchy. See the `@WebAppConfiguration` javadocs for further details.
+ ===== @ContextHierarchy
`@ContextHierarchy` is a class-level annotation that is used to define a hierarchy of
* `@ContextHierarchy` ++ApplicationContext++s for integration tests. `@ContextHierarchy` should be declared
with a list of one or more `@ContextConfiguration` instances, each of which defines a
+ level in the context hierarchy. The following examples demonstrate the use of
`@ContextHierarchy` within a single test class; however, `@ContextHierarchy` can also be
A class-level annotation that is used to define a hierarchy of ++ApplicationContext++s used within a test class hierarchy.
for integration tests. `@ContextHierarchy` should be declared with a list of one or more
`@ContextConfiguration` instances, each of which defines a level in the context
hierarchy. The following examples demonstrate the use of `@ContextHierarchy` within a
single test class; however, `@ContextHierarchy` can also be used within a test class
hierarchy.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
@ -492,8 +454,6 @@ hierarchy.
} }
---- ----
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@ -507,8 +467,6 @@ hierarchy.
} }
---- ----
+
If you need to merge or override the configuration for a given level of the context If you need to merge or override the configuration for a given level of the context
hierarchy within a test class hierarchy, you must explicitly name that level by hierarchy within a test class hierarchy, you must explicitly name that level by
supplying the same value to the `name` attribute in `@ContextConfiguration` at each supplying the same value to the `name` attribute in `@ContextConfiguration` at each
@ -516,14 +474,10 @@ corresponding level in the class hierarchy. See
<<testcontext-ctx-management-ctx-hierarchies>> and the `@ContextHierarchy` javadocs <<testcontext-ctx-management-ctx-hierarchies>> and the `@ContextHierarchy` javadocs
for further examples. for further examples.
* `@ActiveProfiles` ===== @ActiveProfiles
`@ActiveProfiles` is a class-level annotation that is used to declare which __bean
+ definition profiles__ should be active when loading an `ApplicationContext` for an
integration test.
A class-level annotation that is used to declare which __bean definition profiles__
should be active when loading an `ApplicationContext` for test classes.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
@ -535,8 +489,6 @@ should be active when loading an `ApplicationContext` for test classes.
} }
---- ----
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@ -547,8 +499,6 @@ should be active when loading an `ApplicationContext` for test classes.
} }
---- ----
+
[NOTE] [NOTE]
==== ====
`@ActiveProfiles` provides support for __inheriting__ active bean definition profiles `@ActiveProfiles` provides support for __inheriting__ active bean definition profiles
@ -558,20 +508,13 @@ definition profiles programmatically by implementing a custom
and registering it via the `resolver` attribute of `@ActiveProfiles`. and registering it via the `resolver` attribute of `@ActiveProfiles`.
==== ====
+
See <<testcontext-ctx-management-env-profiles>> and the `@ActiveProfiles` javadocs See <<testcontext-ctx-management-env-profiles>> and the `@ActiveProfiles` javadocs
for examples and further details. for examples and further details.
* `@TestPropertySource` ===== @TestPropertySource
`@TestPropertySource` is a class-level annotation that is used to configure the locations
+ of properties files and inlined properties to be added to the set of `PropertySources` in
the `Environment` for an `ApplicationContext` loaded for an integration test.
A class-level annotation that is used to configure the locations of properties files and
inlined properties to be added to the set of `PropertySources` in the `Environment` for
an `ApplicationContext` loaded for an integration test.
+
Test property sources have higher precedence than those loaded from the operating Test property sources have higher precedence than those loaded from the operating
system's environment or Java system properties as well as property sources added by the system's environment or Java system properties as well as property sources added by the
@ -580,12 +523,8 @@ sources can be used to selectively override properties defined in system and app
property sources. Furthermore, inlined properties have higher precedence than properties property sources. Furthermore, inlined properties have higher precedence than properties
loaded from resource locations. loaded from resource locations.
+
The following example demonstrates how to declare a properties file from the classpath. The following example demonstrates how to declare a properties file from the classpath.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@ -596,12 +535,8 @@ The following example demonstrates how to declare a properties file from the cla
} }
---- ----
+
The following example demonstrates how to declare _inlined_ properties. The following example demonstrates how to declare _inlined_ properties.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@ -612,32 +547,23 @@ The following example demonstrates how to declare _inlined_ properties.
} }
---- ----
* `@DirtiesContext` ===== @DirtiesContext
`@DirtiesContext` indicates that the underlying Spring `ApplicationContext` has been
+ __dirtied__ during the execution of a test (i.e., modified or corrupted in some manner --
for example, by changing the state of a singleton bean) and should be closed. When an
Indicates that the underlying Spring `ApplicationContext` has been __dirtied__ during application context is marked __dirty__, it is removed from the testing framework's cache
the execution of a test (i.e., modified or corrupted in some manner -- for example, by and closed. As a consequence, the underlying Spring container will be rebuilt for any
changing the state of a singleton bean) and should be closed. When an application
context is marked __dirty__, it is removed from the testing framework's cache and
closed. As a consequence, the underlying Spring container will be rebuilt for any
subsequent test that requires a context with the same configuration metadata. subsequent test that requires a context with the same configuration metadata.
+
`@DirtiesContext` can be used as both a class-level and method-level annotation within `@DirtiesContext` can be used as both a class-level and method-level annotation within
the same class or class hierarchy. In such scenarios, the `ApplicationContext` is marked the same class or class hierarchy. In such scenarios, the `ApplicationContext` is marked
as __dirty__ before or after any such annotated method as well as before or after the as __dirty__ before or after any such annotated method as well as before or after the
current test class, depending on the configured `methodMode` and `classMode`. current test class, depending on the configured `methodMode` and `classMode`.
+
The following examples explain when the context would be dirtied for various The following examples explain when the context would be dirtied for various
configuration scenarios: configuration scenarios:
+ * Before the current test class, when declared on a class with class mode set to
** Before the current test class, when declared on a class with class mode set to
`BEFORE_CLASS`. `BEFORE_CLASS`.
+ +
@ -653,7 +579,7 @@ configuration scenarios:
+ +
** After the current test class, when declared on a class with class mode set to * After the current test class, when declared on a class with class mode set to
`AFTER_CLASS` (i.e., the default class mode). `AFTER_CLASS` (i.e., the default class mode).
+ +
@ -669,7 +595,7 @@ configuration scenarios:
+ +
** Before each test method in the current test class, when declared on a class with class * Before each test method in the current test class, when declared on a class with class
mode set to `BEFORE_EACH_TEST_METHOD.` mode set to `BEFORE_EACH_TEST_METHOD.`
+ +
@ -685,7 +611,7 @@ mode set to `BEFORE_EACH_TEST_METHOD.`
+ +
** After each test method in the current test class, when declared on a class with class * After each test method in the current test class, when declared on a class with class
mode set to `AFTER_EACH_TEST_METHOD.` mode set to `AFTER_EACH_TEST_METHOD.`
+ +
@ -701,7 +627,7 @@ mode set to `AFTER_EACH_TEST_METHOD.`
+ +
** Before the current test, when declared on a method with the method mode set to * Before the current test, when declared on a method with the method mode set to
`BEFORE_METHOD`. `BEFORE_METHOD`.
+ +
@ -718,7 +644,7 @@ mode set to `AFTER_EACH_TEST_METHOD.`
+ +
** After the current test, when declared on a method with the method mode set to * After the current test, when declared on a method with the method mode set to
`AFTER_METHOD` (i.e., the default method mode). `AFTER_METHOD` (i.e., the default method mode).
+ +
@ -733,8 +659,6 @@ mode set to `AFTER_EACH_TEST_METHOD.`
} }
---- ----
+
If `@DirtiesContext` is used in a test whose context is configured as part of a context If `@DirtiesContext` is used in a test whose context is configured as part of a context
hierarchy via `@ContextHierarchy`, the `hierarchyMode` flag can be used to control how hierarchy via `@ContextHierarchy`, the `hierarchyMode` flag can be used to control how
the context cache is cleared. By default an __exhaustive__ algorithm will be used that the context cache is cleared. By default an __exhaustive__ algorithm will be used that
@ -745,8 +669,6 @@ will be removed from the context cache and closed. If the __exhaustive__ algorit
overkill for a particular use case, the simpler __current level__ algorithm can be overkill for a particular use case, the simpler __current level__ algorithm can be
specified instead, as seen below. specified instead, as seen below.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@ -768,20 +690,14 @@ specified instead, as seen below.
} }
---- ----
+
For further details regarding the `EXHAUSTIVE` and `CURRENT_LEVEL` algorithms see the For further details regarding the `EXHAUSTIVE` and `CURRENT_LEVEL` algorithms see the
`DirtiesContext.HierarchyMode` javadocs. `DirtiesContext.HierarchyMode` javadocs.
* `@TestExecutionListeners` ===== @TestExecutionListeners
`@TestExecutionListeners` defines class-level metadata for configuring the
+ `TestExecutionListener` implementations that should be registered with the
`TestContextManager`. Typically, `@TestExecutionListeners` is used in conjunction with
Defines class-level metadata for configuring which ++TestExecutionListener++s should be `@ContextConfiguration`.
registered with the `TestContextManager`. Typically, `@TestExecutionListeners` is used
in conjunction with `@ContextConfiguration`.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
@ -793,23 +709,15 @@ in conjunction with `@ContextConfiguration`.
} }
---- ----
+ `@TestExecutionListeners` supports _inherited_ listeners by default. See the javadocs
`@TestExecutionListeners` supports __inherited__ listeners by default. See the javadocs
for an example and further details. for an example and further details.
+ ===== @Commit
`@Commit` indicates that the transaction for a transactional test method should be
* `@Commit` __committed__ after the test method has completed. `@Commit` can be used as a direct
replacement for `@Rollback(false)` in order to more explicitly convey the intent of the
+ code. Analogous to `@Rollback`, `@Commit` may also be declared as a class-level or
method-level annotation.
Indicates that the transaction for a transactional test method should be __committed__
after the test method has completed. `@Commit` can be used as a direct replacement for
`@Rollback(false)` in order to more explicitly convey the intent of the code. Analogous to
`@Rollback`, `@Commit` may also be declared as a class-level or method-level annotation.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
@ -821,25 +729,18 @@ after the test method has completed. `@Commit` can be used as a direct replaceme
} }
---- ----
* `@Rollback` ===== @Rollback
`@Rollback` indicates whether the transaction for a transactional test method should be
+ __rolled back__ after the test method has completed. If `true`, the transaction is rolled
back; otherwise, the transaction is committed (see also `@Commit`). Rollback semantics
Indicates whether the transaction for a transactional test method should be __rolled for integration tests in the Spring TestContext Framework default to `true` even if
back__ after the test method has completed. If `true`, the transaction is rolled back;
otherwise, the transaction is committed (see also `@Commit`). Rollback semantics for
integration tests in the Spring TestContext Framework default to `true` even if
`@Rollback` is not explicitly declared. `@Rollback` is not explicitly declared.
+
When declared as a class-level annotation, `@Rollback` defines the default rollback When declared as a class-level annotation, `@Rollback` defines the default rollback
semantics for all test methods within the test class hierarchy. When declared as a semantics for all test methods within the test class hierarchy. When declared as a
method-level annotation, `@Rollback` defines rollback semantics for the specific test method-level annotation, `@Rollback` defines rollback semantics for the specific test
method, potentially overriding class-level `@Rollback` or `@Commit` semantics. method, potentially overriding class-level `@Rollback` or `@Commit` semantics.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@ -850,18 +751,12 @@ method, potentially overriding class-level `@Rollback` or `@Commit` semantics.
} }
---- ----
* `@BeforeTransaction` ===== @BeforeTransaction
`@BeforeTransaction` indicates that the annotated `void` method should be executed
+ __before__ a transaction is started for test methods configured to run within a
transaction via Spring's `@Transactional` annotation. As of Spring Framework 4.3,
Indicates that the annotated `void` method should be executed __before__ a transaction `@BeforeTransaction` methods are not required to be `public` and may be declared on Java
is started for test methods configured to run within a transaction via Spring's 8 based interface default methods.
`@Transactional` annotation. As of Spring Framework 4.3, `@BeforeTransaction` methods
are not required to be `public` and may be declared on Java 8 based interface default
methods.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
@ -872,17 +767,12 @@ methods.
} }
---- ----
* `@AfterTransaction` ===== @AfterTransaction
`@AfterTransaction` indicates that the annotated `void` method should be executed
+ __after__ a transaction is ended for test methods configured to run within a transaction
via Spring's `@Transactional` annotation. As of Spring Framework 4.3, `@AfterTransaction`
Indicates that the annotated `void` method should be executed __after__ a transaction methods are not required to be `public` and may be declared on Java 8 based interface
is ended for test methods configured to run within a transaction via Spring's default methods.
`@Transactional` annotation. As of Spring Framework 4.3, `@AfterTransaction` methods
are not required to be `public` and may be declared on Java 8 based interface default
methods.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
@ -893,14 +783,9 @@ methods.
} }
---- ----
* `@Sql` ===== @Sql
`@Sql` is used to annotate a test class or test method to configure SQL scripts to be
+ executed against a given database during integration tests.
Used to annotate a test class or test method to configure SQL scripts to be executed
against a given database during integration tests.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
@ -912,18 +797,11 @@ against a given database during integration tests.
} }
---- ----
+
See <<testcontext-executing-sql-declaratively>> for further details. See <<testcontext-executing-sql-declaratively>> for further details.
* `@SqlConfig` ===== @SqlConfig
`@SqlConfig` defines metadata that is used to determine how to parse and execute SQL
+ scripts configured via the `@Sql` annotation.
Defines metadata that is used to determine how to parse and execute SQL scripts
configured via the `@Sql` annotation.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
@ -938,16 +816,12 @@ configured via the `@Sql` annotation.
} }
---- ----
* `@SqlGroup` ===== @SqlGroup
`@SqlGroup` is a container annotation that aggregates several `@Sql` annotations.
+ `@SqlGroup` can be used natively, declaring several nested `@Sql` annotations, or it can
be used in conjunction with Java 8's support for repeatable annotations, where `@Sql` can
A container annotation that aggregates several `@Sql` annotations. Can be used natively, simply be declared several times on the same class or method, implicitly generating this
declaring several nested `@Sql` annotations. Can also be used in conjunction with Java container annotation.
8's support for repeatable annotations, where `@Sql` can simply be declared several times
on the same class or method, implicitly generating this container annotation.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
@ -1002,15 +876,11 @@ The following annotations are __only__ supported when used in conjunction with t
<<testcontext-junit4-runner,SpringRunner>>, <<testcontext-junit4-rules,Spring's JUnit <<testcontext-junit4-runner,SpringRunner>>, <<testcontext-junit4-rules,Spring's JUnit
rules>>, or <<testcontext-support-classes-junit4,Spring's JUnit 4 support classes>>. rules>>, or <<testcontext-support-classes-junit4,Spring's JUnit 4 support classes>>.
* `@IfProfileValue` ===== @IfProfileValue
`@IfProfileValue` indicates that the annotated test is enabled for a specific testing
+ environment. If the configured `ProfileValueSource` returns a matching `value` for the
provided `name`, the test is enabled. Otherwise, the test will be disabled and
Indicates that the annotated test is enabled for a specific testing environment. If the effectively _ignored_.
configured `ProfileValueSource` returns a matching `value` for the provided `name`, the
test is enabled. Otherwise, the test will be disabled and effectively _ignored_.
+
`@IfProfileValue` can be applied at the class level, the method level, or both. `@IfProfileValue` can be applied at the class level, the method level, or both.
Class-level usage of `@IfProfileValue` takes precedence over method-level usage for any Class-level usage of `@IfProfileValue` takes precedence over method-level usage for any
@ -1020,8 +890,6 @@ enabled both at the class level _and_ at the method level; the absence of
semantics of JUnit 4's `@Ignore` annotation, except that the presence of `@Ignore` always semantics of JUnit 4's `@Ignore` annotation, except that the presence of `@Ignore` always
disables a test. disables a test.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@ -1032,14 +900,10 @@ disables a test.
} }
---- ----
+
Alternatively, you can configure `@IfProfileValue` with a list of `values` (with __OR__ Alternatively, you can configure `@IfProfileValue` with a list of `values` (with __OR__
semantics) to achieve TestNG-like support for __test groups__ in a JUnit 4 environment. semantics) to achieve TestNG-like support for __test groups__ in a JUnit 4 environment.
Consider the following example: Consider the following example:
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@ -1050,18 +914,11 @@ Consider the following example:
} }
---- ----
+ ===== @ProfileValueSourceConfiguration
`@ProfileValueSourceConfiguration` is a class-level annotation that specifies what type
* `@ProfileValueSourceConfiguration` of `ProfileValueSource` to use when retrieving __profile values__ configured through the
`@IfProfileValue` annotation. If `@ProfileValueSourceConfiguration` is not declared for a
+ test, `SystemProfileValueSource` is used by default.
Class-level annotation that specifies what type of `ProfileValueSource` to use when
retrieving __profile values__ configured through the `@IfProfileValue` annotation. If
`@ProfileValueSourceConfiguration` is not declared for a test,
`SystemProfileValueSource` is used by default.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
@ -1072,21 +929,14 @@ retrieving __profile values__ configured through the `@IfProfileValue` annotatio
} }
---- ----
* `@Timed` ===== @Timed
`@Timed` indicates that the annotated test method must finish execution in a specified
+ time period (in milliseconds). If the text execution time exceeds the specified time
period, the test fails.
Indicates that the annotated test method must finish execution in a specified time
period (in milliseconds). If the text execution time exceeds the specified time period,
the test fails.
+
The time period includes execution of the test method itself, any repetitions of the The time period includes execution of the test method itself, any repetitions of the
test (see `@Repeat`), as well as any __set up__ or __tear down__ of the test fixture. test (see `@Repeat`), as well as any __set up__ or __tear down__ of the test fixture.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@ -1096,8 +946,6 @@ test (see `@Repeat`), as well as any __set up__ or __tear down__ of the test fix
} }
---- ----
+
Spring's `@Timed` annotation has different semantics than JUnit 4's `@Test(timeout=...)` Spring's `@Timed` annotation has different semantics than JUnit 4's `@Test(timeout=...)`
support. Specifically, due to the manner in which JUnit 4 handles test execution timeouts support. Specifically, due to the manner in which JUnit 4 handles test execution timeouts
(that is, by executing the test method in a separate `Thread`), `@Test(timeout=...)` (that is, by executing the test method in a separate `Thread`), `@Test(timeout=...)`
@ -1105,20 +953,13 @@ preemptively fails the test if the test takes too long. Spring's `@Timed`, on th
hand, does not preemptively fail the test but rather waits for the test to complete hand, does not preemptively fail the test but rather waits for the test to complete
before failing. before failing.
* `@Repeat` ===== @Repeat
`@Repeat` indicates that the annotated test method must be executed repeatedly. The
+ number of times that the test method is to be executed is specified in the annotation.
Indicates that the annotated test method must be executed repeatedly. The number of
times that the test method is to be executed is specified in the annotation.
+
The scope of execution to be repeated includes execution of the test method itself as The scope of execution to be repeated includes execution of the test method itself as
well as any __set up__ or __tear down__ of the test fixture. well as any __set up__ or __tear down__ of the test fixture.
+
[source,java,indent=0] [source,java,indent=0]
[subs="verbatim,quotes"] [subs="verbatim,quotes"]
---- ----
@ -1132,9 +973,9 @@ well as any __set up__ or __tear down__ of the test fixture.
[[integration-testing-annotations-meta]] [[integration-testing-annotations-meta]]
==== Meta-Annotation Support for Testing ==== Meta-Annotation Support for Testing
Since Spring Framework 4.0, it is possible to use test-related annotations as It is possible to use most test-related annotations as
<<beans-meta-annotations,meta-annotations>> in order to create custom _composed annotations_ <<beans-meta-annotations,meta-annotations>> in order to create custom _composed
and reduce configuration duplication across a test suite. annotations_ and reduce configuration duplication across a test suite.
Each of the following may be used as meta-annotations in conjunction with the Each of the following may be used as meta-annotations in conjunction with the
<<testcontext-framework,TestContext framework>>. <<testcontext-framework,TestContext framework>>.
@ -1248,76 +1089,70 @@ is responsible for loading an `ApplicationContext` for a given test class. Consu
javadocs and the Spring test suite for further information and examples of various javadocs and the Spring test suite for further information and examples of various
implementations. implementations.
* `TestContext`: Encapsulates the context in which a test is executed, agnostic of the ===== TestContext
actual testing framework in use, and provides context management and caching support `TestContext` encapsulates the context in which a test is executed, agnostic of the
for the test instance for which it is responsible. The `TestContext` also delegates to a actual testing framework in use, and provides context management and caching support for
`SmartContextLoader` to load an `ApplicationContext` if requested. the test instance for which it is responsible. The `TestContext` also delegates to a
* `TestContextManager`: The main entry point into the __Spring TestContext Framework__, `SmartContextLoader` to load an `ApplicationContext` if requested.
which manages a single `TestContext` and signals events to each registered
`TestExecutionListener` at well-defined test execution points: ===== TestContextManager
** prior to any __before class__ or __before all__ methods of a particular testing framework `TestContextManager` is the main entry point into the __Spring TestContext Framework__,
** test instance post-processing which manages a single `TestContext` and signals events to each registered
** prior to any __before__ or __before each__ methods of a particular testing framework `TestExecutionListener` at well-defined test execution points:
** after any __after__ or __after each__ methods of a particular testing framework
** after any __after class__ or __after all__ methods of a particular testing framework * prior to any __before class__ or __before all__ methods of a particular testing framework
* `TestExecutionListener`: Defines the API for reacting to test execution * test instance post-processing
events published by the `TestContextManager` with which the listener is registered. See * prior to any __before__ or __before each__ methods of a particular testing framework
<<testcontext-tel-config>>. * after any __after__ or __after each__ methods of a particular testing framework
* `ContextLoader`: Strategy interface introduced in Spring 2.5 for loading an * after any __after class__ or __after all__ methods of a particular testing framework
`ApplicationContext` for an integration test managed by the Spring TestContext
Framework. ===== TestExecutionListener
`TestExecutionListener` defines the API for reacting to test execution events published
+ by the `TestContextManager` with which the listener is registered. See
<<testcontext-tel-config>>.
===== Context Loaders
`ContextLoader` is a strategy interface that was introduced in Spring 2.5 for loading an
`ApplicationContext` for an integration test managed by the Spring TestContext Framework.
Implement `SmartContextLoader` instead of this interface in order to provide support for Implement `SmartContextLoader` instead of this interface in order to provide support for
annotated classes, active bean definition profiles, test property sources, context annotated classes, active bean definition profiles, test property sources, context
hierarchies, and `WebApplicationContext` support. hierarchies, and `WebApplicationContext` support.
* `SmartContextLoader`: Extension of the `ContextLoader` interface introduced in Spring `SmartContextLoader` is an extension of the `ContextLoader` interface introduced in
3.1. Spring 3.1. The `SmartContextLoader` SPI supersedes the `ContextLoader` SPI that was
introduced in Spring 2.5. Specifically, a `SmartContextLoader` can choose to process
+ resource `locations`, annotated `classes`, or context `initializers`. Furthermore, a
The `SmartContextLoader` SPI supersedes the `ContextLoader` SPI that was introduced in
Spring 2.5. Specifically, a `SmartContextLoader` can choose to process resource
`locations`, annotated `classes`, or context `initializers`. Furthermore, a
`SmartContextLoader` can set active bean definition profiles and test property sources in `SmartContextLoader` can set active bean definition profiles and test property sources in
the context that it loads. the context that it loads.
+
Spring provides the following implementations: Spring provides the following implementations:
+ * `DelegatingSmartContextLoader`: one of two default loaders which delegates internally
** `DelegatingSmartContextLoader`: one of two default loaders which delegates internally
to an `AnnotationConfigContextLoader`, a `GenericXmlContextLoader`, or a to an `AnnotationConfigContextLoader`, a `GenericXmlContextLoader`, or a
`GenericGroovyXmlContextLoader` depending either on the configuration declared for the `GenericGroovyXmlContextLoader` depending either on the configuration declared for the
test class or on the presence of default locations or default configuration classes. test class or on the presence of default locations or default configuration classes.
Groovy support is only enabled if Groovy is on the classpath. Groovy support is only enabled if Groovy is on the classpath.
** `WebDelegatingSmartContextLoader`: one of two default loaders which delegates * `WebDelegatingSmartContextLoader`: one of two default loaders which delegates
internally to an `AnnotationConfigWebContextLoader`, a `GenericXmlWebContextLoader`, or a internally to an `AnnotationConfigWebContextLoader`, a `GenericXmlWebContextLoader`, or a
`GenericGroovyXmlWebContextLoader` depending either on the configuration declared for the `GenericGroovyXmlWebContextLoader` depending either on the configuration declared for the
test class or on the presence of default locations or default configuration classes. A test class or on the presence of default locations or default configuration classes. A
web `ContextLoader` will only be used if `@WebAppConfiguration` is present on the test web `ContextLoader` will only be used if `@WebAppConfiguration` is present on the test
class. Groovy support is only enabled if Groovy is on the classpath. class. Groovy support is only enabled if Groovy is on the classpath.
** `AnnotationConfigContextLoader`: loads a standard `ApplicationContext` from * `AnnotationConfigContextLoader`: loads a standard `ApplicationContext` from
__annotated classes__. __annotated classes__.
** `AnnotationConfigWebContextLoader`: loads a `WebApplicationContext` from __annotated * `AnnotationConfigWebContextLoader`: loads a `WebApplicationContext` from __annotated
classes__. classes__.
** `GenericGroovyXmlContextLoader`: loads a standard `ApplicationContext` from __resource * `GenericGroovyXmlContextLoader`: loads a standard `ApplicationContext` from __resource
locations__ that are either Groovy scripts or XML configuration files. locations__ that are either Groovy scripts or XML configuration files.
** `GenericGroovyXmlWebContextLoader`: loads a `WebApplicationContext` from __resource * `GenericGroovyXmlWebContextLoader`: loads a `WebApplicationContext` from __resource
locations__ that are either Groovy scripts or XML configuration files. locations__ that are either Groovy scripts or XML configuration files.
** `GenericXmlContextLoader`: loads a standard `ApplicationContext` from XML __resource * `GenericXmlContextLoader`: loads a standard `ApplicationContext` from XML __resource
locations__. locations__.
** `GenericXmlWebContextLoader`: loads a `WebApplicationContext` from XML __resource * `GenericXmlWebContextLoader`: loads a `WebApplicationContext` from XML __resource
locations__. locations__.
** `GenericPropertiesContextLoader`: loads a standard `ApplicationContext` from Java * `GenericPropertiesContextLoader`: loads a standard `ApplicationContext` from Java
Properties files. Properties files.
The following sections explain how to configure the TestContext framework and provide
working examples of how to write unit and integration tests with the framework.
[[testcontext-tel-config]] [[testcontext-tel-config]]
==== TestExecutionListener configuration ==== TestExecutionListener configuration

Loading…
Cancel
Save