Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
爱吃血肠
spring-framework
提交
d77b715d
S
spring-framework
项目概览
爱吃血肠
/
spring-framework
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
spring-framework
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
d77b715d
编写于
5月 25, 2018
作者:
A
asympro
提交者:
Sam Brannen
7月 21, 2019
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Merge class-level and method-level @Sql declarations
See gh-1835
上级
b0939a8a
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
137 addition
and
20 deletion
+137
-20
spring-test/src/main/java/org/springframework/test/context/jdbc/Sql.java
.../main/java/org/springframework/test/context/jdbc/Sql.java
+28
-1
spring-test/src/main/java/org/springframework/test/context/jdbc/SqlScriptsTestExecutionListener.java
...rk/test/context/jdbc/SqlScriptsTestExecutionListener.java
+44
-19
spring-test/src/test/java/org/springframework/test/context/jdbc/RepeatableSqlAnnotationSqlScriptsTests.java
.../context/jdbc/RepeatableSqlAnnotationSqlScriptsTests.java
+5
-0
spring-test/src/test/java/org/springframework/test/context/jdbc/SqlMethodMergeTest.java
...springframework/test/context/jdbc/SqlMethodMergeTest.java
+30
-0
spring-test/src/test/java/org/springframework/test/context/jdbc/SqlMethodOverrideTest.java
...ingframework/test/context/jdbc/SqlMethodOverrideTest.java
+30
-0
未找到文件。
spring-test/src/main/java/org/springframework/test/context/jdbc/Sql.java
浏览文件 @
d77b715d
...
...
@@ -31,7 +31,8 @@ import org.springframework.core.annotation.AliasFor;
* SQL {@link #scripts} and {@link #statements} to be executed against a given
* database during integration tests.
*
* <p>Method-level declarations override class-level declarations.
* <p>Method-level declarations override class-level declarations by default.
* This behaviour can be adjusted via {@link MergeMode}
*
* <p>Script execution is performed by the {@link SqlScriptsTestExecutionListener},
* which is enabled by default.
...
...
@@ -146,6 +147,13 @@ public @interface Sql {
*/
SqlConfig
config
()
default
@SqlConfig
;
/**
* Indicates whether this annotation should be merged with upper-level annotations
* or override them.
* <p>Defaults to {@link MergeMode#OVERRIDE}.
*/
MergeMode
mergeMode
()
default
MergeMode
.
OVERRIDE
;
/**
* Enumeration of <em>phases</em> that dictate when SQL scripts are executed.
...
...
@@ -165,4 +173,23 @@ public @interface Sql {
AFTER_TEST_METHOD
}
/**
* Enumeration of <em>modes</em> that dictate whether or not
* declared SQL {@link #scripts} and {@link #statements} are merged
* with the upper-level annotations.
*/
enum
MergeMode
{
/**
* Indicates that locally declared SQL {@link #scripts} and {@link #statements}
* should override the upper-level (e.g. Class-level) annotations.
*/
OVERRIDE
,
/**
* Indicates that locally declared SQL {@link #scripts} and {@link #statements}
* should be merged the upper-level (e.g. Class-level) annotations.
*/
MERGE
}
}
spring-test/src/main/java/org/springframework/test/context/jdbc/SqlScriptsTestExecutionListener.java
浏览文件 @
d77b715d
...
...
@@ -16,14 +16,17 @@
package
org.springframework.test.context.jdbc
;
import
java.lang.reflect.AnnotatedElement
;
import
java.lang.reflect.Method
;
import
java.util.List
;
import
java.util.Set
;
import
java.util.stream.Collectors
;
import
javax.sql.DataSource
;
import
org.apache.commons.logging.Log
;
import
org.apache.commons.logging.LogFactory
;
import
org.jetbrains.annotations.NotNull
;
import
org.springframework.context.ApplicationContext
;
import
org.springframework.core.annotation.AnnotatedElementUtils
;
import
org.springframework.core.io.ByteArrayResource
;
...
...
@@ -126,19 +129,35 @@ public class SqlScriptsTestExecutionListener extends AbstractTestExecutionListen
* {@link TestContext} and {@link ExecutionPhase}.
*/
private
void
executeSqlScripts
(
TestContext
testContext
,
ExecutionPhase
executionPhase
)
throws
Exception
{
boolean
classLevel
=
false
;
Set
<
Sql
>
sqlAnnotations
=
AnnotatedElementUtils
.
getMergedRepeatableAnnotations
(
testContext
.
getTestMethod
(),
Sql
.
class
,
SqlGroup
.
class
);
if
(
sqlAnnotations
.
isEmpty
())
{
sqlAnnotations
=
AnnotatedElementUtils
.
getMergedRepeatableAnnotations
(
testContext
.
getTestClass
(),
Sql
.
class
,
SqlGroup
.
class
);
if
(!
sqlAnnotations
.
isEmpty
())
{
classLevel
=
true
;
}
Set
<
Sql
>
methodLevelSqls
=
getScriptsFromElement
(
testContext
.
getTestMethod
())
;
List
<
Sql
>
methodLevelOverrides
=
methodLevelSqls
.
stream
()
.
filter
(
s
->
s
.
executionPhase
()
==
executionPhase
)
.
filter
(
s
->
s
.
mergeMode
()
==
Sql
.
MergeMode
.
OVERRIDE
)
.
collect
(
Collectors
.
toList
());
if
(
methodLevelOverrides
.
isEmpty
())
{
executeScripts
(
getScriptsFromElement
(
testContext
.
getTestClass
()),
testContext
,
executionPhase
,
true
);
executeScripts
(
methodLevelSqls
,
testContext
,
executionPhase
,
false
);
}
else
{
executeScripts
(
methodLevelOverrides
,
testContext
,
executionPhase
,
false
);
}
}
/**
* Get SQL scripts configured via {@link Sql @Sql} for the supplied
* {@link AnnotatedElement}.
*/
private
Set
<
Sql
>
getScriptsFromElement
(
AnnotatedElement
annotatedElement
)
throws
Exception
{
return
AnnotatedElementUtils
.
getMergedRepeatableAnnotations
(
annotatedElement
,
Sql
.
class
,
SqlGroup
.
class
);
}
for
(
Sql
sql
:
sqlAnnotations
)
{
/**
* Execute given {@link Sql @Sql} scripts.
* {@link AnnotatedElement}.
*/
private
void
executeScripts
(
Iterable
<
Sql
>
scripts
,
TestContext
testContext
,
ExecutionPhase
executionPhase
,
boolean
classLevel
)
throws
Exception
{
for
(
Sql
sql
:
scripts
)
{
executeSqlScripts
(
sql
,
executionPhase
,
testContext
,
classLevel
);
}
}
...
...
@@ -166,14 +185,7 @@ public class SqlScriptsTestExecutionListener extends AbstractTestExecutionListen
mergedSqlConfig
,
executionPhase
,
testContext
));
}
final
ResourceDatabasePopulator
populator
=
new
ResourceDatabasePopulator
();
populator
.
setSqlScriptEncoding
(
mergedSqlConfig
.
getEncoding
());
populator
.
setSeparator
(
mergedSqlConfig
.
getSeparator
());
populator
.
setCommentPrefix
(
mergedSqlConfig
.
getCommentPrefix
());
populator
.
setBlockCommentStartDelimiter
(
mergedSqlConfig
.
getBlockCommentStartDelimiter
());
populator
.
setBlockCommentEndDelimiter
(
mergedSqlConfig
.
getBlockCommentEndDelimiter
());
populator
.
setContinueOnError
(
mergedSqlConfig
.
getErrorMode
()
==
ErrorMode
.
CONTINUE_ON_ERROR
);
populator
.
setIgnoreFailedDrops
(
mergedSqlConfig
.
getErrorMode
()
==
ErrorMode
.
IGNORE_FAILED_DROPS
);
final
ResourceDatabasePopulator
populator
=
configurePopulator
(
mergedSqlConfig
);
String
[]
scripts
=
getScripts
(
sql
,
testContext
,
classLevel
);
scripts
=
TestContextResourceUtils
.
convertToClasspathResourcePaths
(
testContext
.
getTestClass
(),
scripts
);
...
...
@@ -232,6 +244,19 @@ public class SqlScriptsTestExecutionListener extends AbstractTestExecutionListen
}
}
@NotNull
private
ResourceDatabasePopulator
configurePopulator
(
MergedSqlConfig
mergedSqlConfig
)
{
final
ResourceDatabasePopulator
populator
=
new
ResourceDatabasePopulator
();
populator
.
setSqlScriptEncoding
(
mergedSqlConfig
.
getEncoding
());
populator
.
setSeparator
(
mergedSqlConfig
.
getSeparator
());
populator
.
setCommentPrefix
(
mergedSqlConfig
.
getCommentPrefix
());
populator
.
setBlockCommentStartDelimiter
(
mergedSqlConfig
.
getBlockCommentStartDelimiter
());
populator
.
setBlockCommentEndDelimiter
(
mergedSqlConfig
.
getBlockCommentEndDelimiter
());
populator
.
setContinueOnError
(
mergedSqlConfig
.
getErrorMode
()
==
ErrorMode
.
CONTINUE_ON_ERROR
);
populator
.
setIgnoreFailedDrops
(
mergedSqlConfig
.
getErrorMode
()
==
ErrorMode
.
IGNORE_FAILED_DROPS
);
return
populator
;
}
@Nullable
private
DataSource
getDataSourceFromTransactionManager
(
PlatformTransactionManager
transactionManager
)
{
try
{
...
...
spring-test/src/test/java/org/springframework/test/context/jdbc/RepeatableSqlAnnotationSqlScriptsTests.java
浏览文件 @
d77b715d
...
...
@@ -25,6 +25,7 @@ import org.junit.runners.MethodSorters;
import
org.springframework.test.annotation.DirtiesContext
;
import
org.springframework.test.context.ContextConfiguration
;
import
org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests
;
import
org.springframework.test.jdbc.JdbcTestUtils
;
import
static
org
.
assertj
.
core
.
api
.
Assertions
.
assertThat
;
...
...
@@ -58,6 +59,10 @@ public class RepeatableSqlAnnotationSqlScriptsTests extends AbstractTransactiona
assertNumUsers
(
2
);
}
protected
int
countRowsInTable
(
String
tableName
)
{
return
JdbcTestUtils
.
countRowsInTable
(
this
.
jdbcTemplate
,
tableName
);
}
protected
void
assertNumUsers
(
int
expected
)
{
assertThat
(
countRowsInTable
(
"user"
)).
as
(
"Number of rows in the 'user' table."
).
isEqualTo
(
expected
);
}
...
...
spring-test/src/test/java/org/springframework/test/context/jdbc/SqlMethodMergeTest.java
0 → 100644
浏览文件 @
d77b715d
package
org.springframework.test.context.jdbc
;
import
org.junit.Test
;
import
org.springframework.test.annotation.DirtiesContext
;
import
org.springframework.test.context.ContextConfiguration
;
import
org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests
;
import
static
org
.
junit
.
Assert
.
assertEquals
;
/**
* Test to verify method level merge of @Sql annotations.
*
* @author Dmitry Semukhin
*/
@ContextConfiguration
(
classes
=
EmptyDatabaseConfig
.
class
)
@Sql
(
value
=
{
"schema.sql"
,
"data-add-catbert.sql"
})
@DirtiesContext
public
class
SqlMethodMergeTest
extends
AbstractTransactionalJUnit4SpringContextTests
{
@Test
@Sql
(
value
=
"data-add-dogbert.sql"
,
mergeMode
=
Sql
.
MergeMode
.
MERGE
)
public
void
testMerge
()
{
assertNumUsers
(
2
);
}
protected
void
assertNumUsers
(
int
expected
)
{
assertEquals
(
"Number of rows in the 'user' table."
,
expected
,
countRowsInTable
(
"user"
));
}
}
spring-test/src/test/java/org/springframework/test/context/jdbc/SqlMethodOverrideTest.java
0 → 100644
浏览文件 @
d77b715d
package
org.springframework.test.context.jdbc
;
import
org.junit.Test
;
import
org.springframework.test.annotation.DirtiesContext
;
import
org.springframework.test.context.ContextConfiguration
;
import
org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests
;
import
static
org
.
junit
.
Assert
.
assertEquals
;
/**
* Test to verify method level override of @Sql annotations.
*
* @author Dmitry Semukhin
*/
@ContextConfiguration
(
classes
=
EmptyDatabaseConfig
.
class
)
@Sql
(
value
=
{
"schema.sql"
,
"data-add-catbert.sql"
})
@DirtiesContext
public
class
SqlMethodOverrideTest
extends
AbstractTransactionalJUnit4SpringContextTests
{
@Test
@Sql
(
value
=
{
"schema.sql"
,
"data.sql"
,
"data-add-dogbert.sql"
,
"data-add-catbert.sql"
},
mergeMode
=
Sql
.
MergeMode
.
OVERRIDE
)
public
void
testMerge
()
{
assertNumUsers
(
3
);
}
protected
void
assertNumUsers
(
int
expected
)
{
assertEquals
(
"Number of rows in the 'user' table."
,
expected
,
countRowsInTable
(
"user"
));
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录