提交 ccdf04e9 编写于 作者: S Sam Brannen

Document @SqlMergeMode support in reference manual

See gh-1835
上级 89571ea2
......@@ -419,6 +419,7 @@ Spring's testing annotations include the following:
* <<spring-testing-annotation-aftertransaction>>
* <<spring-testing-annotation-sql>>
* <<spring-testing-annotation-sqlconfig>>
* <<spring-testing-annotation-sqlmergemode>>
* <<spring-testing-annotation-sqlgroup>>
[[spring-testing-annotation-bootstrapwith]]
......@@ -968,9 +969,9 @@ it:
----
<1> Run two scripts for this test.
See <<testcontext-executing-sql-declaratively>> for further details.
[[spring-testing-annotation-sqlconfig]]
===== `@SqlConfig`
......@@ -992,6 +993,56 @@ configured with the `@Sql` annotation. The following example shows how to use it
<1> Set the comment prefix and the separator in SQL scripts.
[[spring-testing-annotation-sqlmergemode]]
===== `@SqlMergeMode`
`@SqlMergeMode` is used to annotate a test class or test method to configure whether
method-level `@Sql` declarations are merged with class-level `@Sql` declarations. If
`@SqlMergeMode` is not declared on a test class or test method, the `OVERRIDE` merge mode
will be used by default. With the `OVERRIDE` mode, method-level `@Sql` declarations will
effectively override class-level `@Sql` declarations.
Note that a method-level `@SqlMergeMode` declaration overrides a class-level declaration.
The following example shows how to use `@SqlMergeMode` at the class level.
[source,java,indent=0]
[subs="verbatim,quotes"]
----
@SpringJUnitConfig(TestConfig.class)
@Sql("/test-schema.sql")
@SqlMergeMode(MERGE) <1>
class UserTests {
@Test
@Sql("/user-test-data-001.sql")
void standardUserProfile {
// execute code that relies on test data set 001
}
}
----
<1> Set the `@Sql` merge mode to `MERGE` for all test methods in the class.
The following example shows how to use `@SqlMergeMode` at the method level.
[source,java,indent=0]
[subs="verbatim,quotes"]
----
@SpringJUnitConfig(TestConfig.class)
@Sql("/test-schema.sql")
class UserTests {
@Test
@Sql("/user-test-data-001.sql")
@SqlMergeMode(MERGE) <1>
void standardUserProfile {
// execute code that relies on test data set 001
}
}
----
<1> Set the `@Sql` merge mode to `MERGE` for a specific test method.
[[spring-testing-annotation-sqlgroup]]
===== `@SqlGroup`
......@@ -1411,6 +1462,7 @@ You can use each of the following as a meta-annotation in conjunction with the
* `@Rollback`
* `@Sql`
* `@SqlConfig`
* `@SqlMergeMode`
* `@SqlGroup`
* `@Repeat` _(only supported on JUnit 4)_
* `@Timed` _(only supported on JUnit 4)_
......@@ -3997,11 +4049,16 @@ various `executeSqlScript(..)` methods for further details.
In addition to the aforementioned mechanisms for running SQL scripts programmatically,
you can declaratively configure SQL scripts in the Spring TestContext Framework.
Specifically, you can declare the `@Sql` annotation on a test class or test method to
configure the resource paths to SQL scripts that should be run against a given database
before or after an integration test method. Note that method-level declarations override
class-level declarations and that support for `@Sql` is provided by the
`SqlScriptsTestExecutionListener`, which is enabled by default.
configure individual SQL statements or the resource paths to SQL scripts that should be
run against a given database before or after an integration test method. Support for
`@Sql` is provided by the `SqlScriptsTestExecutionListener`, which is enabled by default.
NOTE: Method-level `@Sql` declarations override class-level declarations by default. As
of Spring Framework 5.2, however, this behavior may be configured per test class or per
test method via `@SqlMergeMode`. See
<<testcontext-executing-sql-declaratively-script-merging>> for further details.
[[testcontext-executing-sql-declaratively-script-resources]]
====== Path Resource Semantics
Each path is interpreted as a Spring `Resource`. A plain path (for example,
......@@ -4034,10 +4091,11 @@ within a JUnit Jupiter based integration test class:
}
----
[[testcontext-executing-sql-declaratively-script-detection]]
====== Default Script Detection
If no SQL scripts are specified, an attempt is made to detect a `default` script,
depending on where `@Sql` is declared. If a default cannot be detected, an
If no SQL scripts or statements are specified, an attempt is made to detect a `default`
script, depending on where `@Sql` is declared. If a default cannot be detected, an
`IllegalStateException` is thrown.
* Class-level declaration: If the annotated test class is `com.example.MyTest`, the
......@@ -4046,6 +4104,7 @@ depending on where `@Sql` is declared. If a default cannot be detected, an
defined in the class `com.example.MyTest`, the corresponding default script is
`classpath:com/example/MyTest.testMethod.sql`.
[[testcontext-executing-sql-declaratively-multiple-annotations]]
====== Declaring Multiple `@Sql` Sets
If you need to configure multiple sets of SQL scripts for a given test class or test
......@@ -4088,6 +4147,7 @@ Java 7.
}
----
[[testcontext-executing-sql-declaratively-script-execution-phases]]
====== Script Execution Phases
By default, SQL scripts are executed before the corresponding test method. However, if
......@@ -4117,6 +4177,7 @@ following example shows:
Note that `ISOLATED` and `AFTER_TEST_METHOD` are statically imported from
`Sql.TransactionMode` and `Sql.ExecutionPhase`, respectively.
[[testcontext-executing-sql-declaratively-script-configuration]]
====== Script Configuration with `@SqlConfig`
You can configure script parsing and error handling by using the `@SqlConfig` annotation.
......@@ -4142,8 +4203,6 @@ provided by the `<jdbc:initialize-database/>` XML namespace element. See the jav
individual attributes in {api-spring-framework}/test/context/jdbc/Sql.html[`@Sql`] and
{api-spring-framework}/test/context/jdbc/SqlConfig.html[`@SqlConfig`] for details.
[[testcontext-executing-sql-declaratively-tx]]
*Transaction management for `@Sql`*
......@@ -4208,6 +4267,18 @@ run, since any changes made to the database (either within the test method or wi
`TransactionalTestExecutionListener` (see <<testcontext-tx,transaction management>> for
details).
[[testcontext-executing-sql-declaratively-script-merging]]
====== Merging and Overriding Configuration with `@SqlMergeMode`
As of Spring Framework 5.2, it is possible to merge method-level `@Sql` declarations with
class-level declarations. For example, this allows you to provide the configuration for a
database schema or some common test data once per test class and then provide additional,
use case specific test data per test method. To enable `@Sql` merging, annotate either
your test class or test method with `@SqlMergeMode(MERGE)`. To disable merging for a
specific test method (or specific test subclass), you can switch back to the default mode
via `@SqlMergeMode(OVERRIDE)`. Consult the <<spring-testing-annotation-sqlmergemode,
`@SqlMergeMode` annotation documentation section>> for examples and further details.
[[testcontext-parallel-test-execution]]
==== Parallel Test Execution
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册