spring-framework / org.springframework.test.context.jdbc / Sql

Sql

@Target([AnnotationTarget.CLASS, AnnotationTarget.FILE, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER]) @Inherited class Sql

@Sql is used to annotate a test class or test method to configure SQL #scripts and #statements to be executed against a given database during integration tests.

Method-level declarations override class-level declarations.

Script execution is performed by the SqlScriptsTestExecutionListener, which is enabled by default.

The configuration options provided by this annotation and SqlConfig are equivalent to those supported by org.springframework.jdbc.datasource.init.ScriptUtils and org.springframework.jdbc.datasource.init.ResourceDatabasePopulator but are a superset of those provided by the <jdbc:initialize-database/> XML namespace element. Consult the javadocs of individual attributes in this annotation and SqlConfig for details.

Beginning with Java 8, @Sql can be used as a Repeatable annotation. Otherwise, SqlGroup can be used as an explicit container for declaring multiple instances of @Sql.

This annotation may be used as a meta-annotation to create custom composed annotations with attribute overrides.

Author
Sam Brannen

Since
4.1

See Also
SqlConfigSqlGroupSqlScriptsTestExecutionListenerorg.springframework.transaction.annotation.Transactionalorg.springframework.test.context.transaction.TransactionalTestExecutionListenerorg.springframework.jdbc.datasource.init.ResourceDatabasePopulatororg.springframework.jdbc.datasource.init.ScriptUtils

Constructors

<init>

Sql(vararg value: String, scripts: Array<String>, statements: Array<String>, executionPhase: ExecutionPhase, config: SqlConfig)

@Sql is used to annotate a test class or test method to configure SQL #scripts and #statements to be executed against a given database during integration tests.

Method-level declarations override class-level declarations.

Script execution is performed by the SqlScriptsTestExecutionListener, which is enabled by default.

The configuration options provided by this annotation and SqlConfig are equivalent to those supported by org.springframework.jdbc.datasource.init.ScriptUtils and org.springframework.jdbc.datasource.init.ResourceDatabasePopulator but are a superset of those provided by the <jdbc:initialize-database/> XML namespace element. Consult the javadocs of individual attributes in this annotation and SqlConfig for details.

Beginning with Java 8, @Sql can be used as a Repeatable annotation. Otherwise, SqlGroup can be used as an explicit container for declaring multiple instances of @Sql.

This annotation may be used as a meta-annotation to create custom composed annotations with attribute overrides.

Properties

config

val config: SqlConfig

Local configuration for the SQL scripts and statements declared within this @Sql annotation.

See the class-level javadocs for SqlConfig for explanations of local vs. global configuration, inheritance, overrides, etc.

Defaults to an empty SqlConfig instance.

executionPhase

val executionPhase: ExecutionPhase

When the SQL scripts and statements should be executed.

Defaults to BEFORE_TEST_METHOD.

scripts

val scripts: Array<String>

The paths to the SQL scripts to execute.

This attribute may not be used in conjunction with #value, but it may be used instead of #value. Similarly, this attribute may be used in conjunction with or instead of #statements.

Path Resource Semantics

Each path will be interpreted as a Spring org.springframework.core.io.Resource. A plain path — for example, "schema.sql" — will be treated as a classpath resource that is relative to the package in which the test class is defined. A path starting with a slash will be treated as an absolute classpath resource, for example: "/org/example/schema.sql". A path which references a URL (e.g., a path prefixed with classpath:, file:, http:, etc.) will be loaded using the specified resource protocol.

Default Script Detection

If no SQL scripts or #statements are specified, an attempt will be made to detect a default script depending on where this annotation is declared. If a default cannot be detected, an IllegalStateException will be thrown.

  • class-level declaration: if the annotated test class is com.example.MyTest, the corresponding default script is "classpath:com/example/MyTest.sql".
  • method-level declaration: if the annotated test method is named testMethod() and is defined in the class com.example.MyTest, the corresponding default script is "classpath:com/example/MyTest.testMethod.sql".

statements

val statements: Array<String>

Inlined SQL statements to execute.

This attribute may be used in conjunction with or instead of #scripts.

Ordering

Statements declared via this attribute will be executed after statements loaded from resource #scripts. If you wish to have inlined statements executed before scripts, simply declare multiple instances of @Sql on the same class or method.

value

val value: Array<String>

Alias for #scripts.

This attribute may not be used in conjunction with #scripts, but it may be used instead of #scripts.