Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in / Register
Toggle navigation
S
spring-boot
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
DEMO
spring-boot
Commits
5a7624df
Commit
5a7624df
authored
Dec 02, 2016
by
Eddú Meléndez
Committed by
Stephane Nicoll
Dec 16, 2016
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add support for property spring.test.database.replace
Closes gh-7229
parent
6fb1fb58
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
238 additions
and
3 deletions
+238
-3
AutoConfigureTestDatabase.java
...ot/test/autoconfigure/jdbc/AutoConfigureTestDatabase.java
+2
-0
TestDatabaseAutoConfiguration.java
...est/autoconfigure/jdbc/TestDatabaseAutoConfiguration.java
+50
-3
JdbcTestWithAutoConfigureTestDatabaseReplacePropertyAnyIntegrationTests.java
...figureTestDatabaseReplacePropertyAnyIntegrationTests.java
+73
-0
JdbcTestWithAutoConfigureTestDatabaseReplacePropertyAutoConfiguredIntegrationTests.java
...atabaseReplacePropertyAutoConfiguredIntegrationTests.java
+61
-0
JdbcTestWithAutoConfigureTestDatabaseReplacePropertyNoneIntegrationTests.java
...igureTestDatabaseReplacePropertyNoneIntegrationTests.java
+52
-0
No files found.
spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jdbc/AutoConfigureTestDatabase.java
View file @
5a7624df
...
@@ -28,6 +28,7 @@ import javax.sql.DataSource;
...
@@ -28,6 +28,7 @@ import javax.sql.DataSource;
import
org.springframework.boot.autoconfigure.ImportAutoConfiguration
;
import
org.springframework.boot.autoconfigure.ImportAutoConfiguration
;
import
org.springframework.boot.autoconfigure.jdbc.EmbeddedDatabaseConnection
;
import
org.springframework.boot.autoconfigure.jdbc.EmbeddedDatabaseConnection
;
import
org.springframework.boot.test.autoconfigure.properties.PropertyMapping
;
import
org.springframework.boot.test.autoconfigure.properties.PropertyMapping
;
import
org.springframework.boot.test.autoconfigure.properties.SkipPropertyMapping
;
/**
/**
* Annotation that can be applied to a test class to configure a test database to use
* Annotation that can be applied to a test class to configure a test database to use
...
@@ -48,6 +49,7 @@ public @interface AutoConfigureTestDatabase {
...
@@ -48,6 +49,7 @@ public @interface AutoConfigureTestDatabase {
* Determines what type of existing DataSource beans can be replaced.
* Determines what type of existing DataSource beans can be replaced.
* @return the type of existing DataSource to replace
* @return the type of existing DataSource to replace
*/
*/
@PropertyMapping
(
skip
=
SkipPropertyMapping
.
ON_DEFAULT_VALUE
)
Replace
replace
()
default
Replace
.
ANY
;
Replace
replace
()
default
Replace
.
ANY
;
/**
/**
...
...
spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jdbc/TestDatabaseAutoConfiguration.java
View file @
5a7624df
...
@@ -31,16 +31,22 @@ import org.springframework.beans.factory.support.BeanDefinitionRegistry;
...
@@ -31,16 +31,22 @@ import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import
org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor
;
import
org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor
;
import
org.springframework.beans.factory.support.RootBeanDefinition
;
import
org.springframework.beans.factory.support.RootBeanDefinition
;
import
org.springframework.boot.autoconfigure.AutoConfigureBefore
;
import
org.springframework.boot.autoconfigure.AutoConfigureBefore
;
import
org.springframework.boot.autoconfigure.condition.ConditionMessage
;
import
org.springframework.boot.autoconfigure.condition.ConditionOutcome
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
;
import
org.springframework.boot.autoconfigure.condition.
ConditionalOnProperty
;
import
org.springframework.boot.autoconfigure.condition.
SpringBootCondition
;
import
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
;
import
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
;
import
org.springframework.boot.autoconfigure.jdbc.EmbeddedDatabaseConnection
;
import
org.springframework.boot.autoconfigure.jdbc.EmbeddedDatabaseConnection
;
import
org.springframework.boot.bind.RelaxedPropertyResolver
;
import
org.springframework.context.EnvironmentAware
;
import
org.springframework.context.EnvironmentAware
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.ConditionContext
;
import
org.springframework.context.annotation.Conditional
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.core.Ordered
;
import
org.springframework.core.Ordered
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.core.env.Environment
;
import
org.springframework.core.env.Environment
;
import
org.springframework.core.type.AnnotatedTypeMetadata
;
import
org.springframework.jdbc.datasource.embedded.EmbeddedDatabase
;
import
org.springframework.jdbc.datasource.embedded.EmbeddedDatabase
;
import
org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder
;
import
org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder
;
import
org.springframework.util.Assert
;
import
org.springframework.util.Assert
;
...
@@ -50,6 +56,7 @@ import org.springframework.util.ObjectUtils;
...
@@ -50,6 +56,7 @@ import org.springframework.util.ObjectUtils;
* Auto-configuration for a test database.
* Auto-configuration for a test database.
*
*
* @author Phillip Webb
* @author Phillip Webb
* @author Eddú Meléndez
* @since 1.4.0
* @since 1.4.0
* @see AutoConfigureTestDatabase
* @see AutoConfigureTestDatabase
*/
*/
...
@@ -57,6 +64,9 @@ import org.springframework.util.ObjectUtils;
...
@@ -57,6 +64,9 @@ import org.springframework.util.ObjectUtils;
@AutoConfigureBefore
(
DataSourceAutoConfiguration
.
class
)
@AutoConfigureBefore
(
DataSourceAutoConfiguration
.
class
)
public
class
TestDatabaseAutoConfiguration
{
public
class
TestDatabaseAutoConfiguration
{
private
static
final
String
SPRING_TEST_DATABASE_PREFIX
=
"spring.test.database."
;
private
static
final
String
REPLACE_PROPERTY
=
"replace"
;
private
final
Environment
environment
;
private
final
Environment
environment
;
TestDatabaseAutoConfiguration
(
Environment
environment
)
{
TestDatabaseAutoConfiguration
(
Environment
environment
)
{
...
@@ -64,18 +74,55 @@ public class TestDatabaseAutoConfiguration {
...
@@ -64,18 +74,55 @@ public class TestDatabaseAutoConfiguration {
}
}
@Bean
@Bean
@Conditional
OnProperty
(
prefix
=
"spring.test.database"
,
name
=
"replace"
,
havingValue
=
"AUTO_CONFIGURED"
)
@Conditional
(
TestDatabaseReplaceAutoConfiguredCondition
.
class
)
@ConditionalOnMissingBean
@ConditionalOnMissingBean
public
DataSource
dataSource
()
{
public
DataSource
dataSource
()
{
return
new
EmbeddedDataSourceFactory
(
this
.
environment
).
getEmbeddedDatabase
();
return
new
EmbeddedDataSourceFactory
(
this
.
environment
).
getEmbeddedDatabase
();
}
}
@Bean
@Bean
@Conditional
OnProperty
(
prefix
=
"spring.test.database"
,
name
=
"replace"
,
havingValue
=
"ANY"
,
matchIfMissing
=
true
)
@Conditional
(
TestDatabaseReplaceAnyCondition
.
class
)
public
static
EmbeddedDataSourceBeanFactoryPostProcessor
embeddedDataSourceBeanFactoryPostProcessor
()
{
public
static
EmbeddedDataSourceBeanFactoryPostProcessor
embeddedDataSourceBeanFactoryPostProcessor
()
{
return
new
EmbeddedDataSourceBeanFactoryPostProcessor
();
return
new
EmbeddedDataSourceBeanFactoryPostProcessor
();
}
}
static
class
TestDatabaseReplaceAutoConfiguredCondition
extends
SpringBootCondition
{
@Override
public
ConditionOutcome
getMatchOutcome
(
ConditionContext
context
,
AnnotatedTypeMetadata
metadata
)
{
RelaxedPropertyResolver
resolver
=
new
RelaxedPropertyResolver
(
context
.
getEnvironment
(),
SPRING_TEST_DATABASE_PREFIX
);
ConditionMessage
.
Builder
message
=
ConditionMessage
.
forCondition
(
"Test Database Replace Property"
);
if
(
resolver
.
containsProperty
(
REPLACE_PROPERTY
)
&&
"NONE"
.
equals
(
resolver
.
getProperty
(
REPLACE_PROPERTY
)))
{
return
ConditionOutcome
.
noMatch
(
message
.
didNotFind
(
"NONE"
).
atAll
());
}
else
if
(
resolver
.
containsProperty
(
REPLACE_PROPERTY
)
&&
"AUTO_CONFIGURED"
.
equals
(
resolver
.
getProperty
(
REPLACE_PROPERTY
)))
{
return
ConditionOutcome
.
match
(
message
.
found
(
"AUTO_CONFIGURED"
).
atAll
());
}
return
ConditionOutcome
.
noMatch
(
message
.
didNotFind
(
"spring.test.database.replace"
).
atAll
());
}
}
static
class
TestDatabaseReplaceAnyCondition
extends
SpringBootCondition
{
@Override
public
ConditionOutcome
getMatchOutcome
(
ConditionContext
context
,
AnnotatedTypeMetadata
metadata
)
{
RelaxedPropertyResolver
resolver
=
new
RelaxedPropertyResolver
(
context
.
getEnvironment
(),
SPRING_TEST_DATABASE_PREFIX
);
ConditionMessage
.
Builder
message
=
ConditionMessage
.
forCondition
(
"Test Database Replace Property"
);
if
(
resolver
.
containsProperty
(
REPLACE_PROPERTY
)
&&
"NONE"
.
equals
(
resolver
.
getProperty
(
REPLACE_PROPERTY
)))
{
return
ConditionOutcome
.
noMatch
(
message
.
didNotFind
(
"NONE"
).
atAll
());
}
else
if
(!
resolver
.
containsProperty
(
REPLACE_PROPERTY
)
||
"ANY"
.
equals
(
resolver
.
getProperty
(
REPLACE_PROPERTY
)))
{
return
ConditionOutcome
.
match
(
message
.
found
(
"ANY"
).
atAll
());
}
return
ConditionOutcome
.
noMatch
(
message
.
didNotFind
(
"spring.test.database.replace"
).
atAll
());
}
}
@Order
(
Ordered
.
LOWEST_PRECEDENCE
)
@Order
(
Ordered
.
LOWEST_PRECEDENCE
)
private
static
class
EmbeddedDataSourceBeanFactoryPostProcessor
private
static
class
EmbeddedDataSourceBeanFactoryPostProcessor
implements
BeanDefinitionRegistryPostProcessor
{
implements
BeanDefinitionRegistryPostProcessor
{
...
...
spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/jdbc/JdbcTestWithAutoConfigureTestDatabaseReplacePropertyAnyIntegrationTests.java
0 → 100644
View file @
5a7624df
/*
* Copyright 2012-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org
.
springframework
.
boot
.
test
.
autoconfigure
.
jdbc
;
import
javax.sql.DataSource
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.autoconfigure.EnableAutoConfiguration
;
import
org.springframework.boot.autoconfigure.jdbc.EmbeddedDatabaseConnection
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder
;
import
org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType
;
import
org.springframework.test.context.TestPropertySource
;
import
org.springframework.test.context.junit4.SpringRunner
;
import
static
org
.
assertj
.
core
.
api
.
Assertions
.
assertThat
;
/**
* Integration tests for {@link JdbcTest}.
*
* @author Phillip Webb
* @author Stephane Nicoll
*/
@RunWith
(
SpringRunner
.
class
)
@JdbcTest
@AutoConfigureTestDatabase
(
connection
=
EmbeddedDatabaseConnection
.
HSQL
)
@TestPropertySource
(
properties
=
"spring.test.database.replace=ANY"
)
public
class
JdbcTestWithAutoConfigureTestDatabaseReplacePropertyAnyIntegrationTests
{
@Autowired
private
DataSource
dataSource
;
@Test
public
void
replacesDefinedDataSourceWithExplicit
()
throws
Exception
{
// H2 is explicitly defined but HSQL is the override.
String
product
=
this
.
dataSource
.
getConnection
().
getMetaData
()
.
getDatabaseProductName
();
assertThat
(
product
).
startsWith
(
"HSQL"
);
}
@Configuration
@EnableAutoConfiguration
static
class
Config
{
@Bean
public
DataSource
dataSource
()
{
EmbeddedDatabaseBuilder
builder
=
new
EmbeddedDatabaseBuilder
()
.
generateUniqueName
(
true
)
.
setType
(
EmbeddedDatabaseType
.
H2
);
return
builder
.
build
();
}
}
}
spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/jdbc/JdbcTestWithAutoConfigureTestDatabaseReplacePropertyAutoConfiguredIntegrationTests.java
0 → 100644
View file @
5a7624df
/*
* Copyright 2012-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org
.
springframework
.
boot
.
test
.
autoconfigure
.
jdbc
;
import
javax.sql.DataSource
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.autoconfigure.EnableAutoConfiguration
;
import
org.springframework.boot.autoconfigure.jdbc.EmbeddedDatabaseConnection
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.test.context.TestPropertySource
;
import
org.springframework.test.context.junit4.SpringRunner
;
import
static
org
.
assertj
.
core
.
api
.
Assertions
.
assertThat
;
/**
* Integration tests for {@link JdbcTest}.
*
* @author Phillip Webb
* @author Stephane Nicoll
*/
@RunWith
(
SpringRunner
.
class
)
@JdbcTest
@AutoConfigureTestDatabase
(
connection
=
EmbeddedDatabaseConnection
.
HSQL
)
@TestPropertySource
(
properties
=
"spring.test.database.replace=AUTO_CONFIGURED"
)
public
class
JdbcTestWithAutoConfigureTestDatabaseReplacePropertyAutoConfiguredIntegrationTests
{
@Autowired
private
DataSource
dataSource
;
@Test
public
void
replacesAutoConfiguredDataSource
()
throws
Exception
{
String
product
=
this
.
dataSource
.
getConnection
().
getMetaData
()
.
getDatabaseProductName
();
assertThat
(
product
).
startsWith
(
"HSQL"
);
}
@Configuration
@EnableAutoConfiguration
// Will auto-configure H2
static
class
Config
{
}
}
spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/jdbc/JdbcTestWithAutoConfigureTestDatabaseReplacePropertyNoneIntegrationTests.java
0 → 100644
View file @
5a7624df
/*
* Copyright 2012-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org
.
springframework
.
boot
.
test
.
autoconfigure
.
jdbc
;
import
javax.sql.DataSource
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.test.context.TestPropertySource
;
import
org.springframework.test.context.junit4.SpringRunner
;
import
static
org
.
assertj
.
core
.
api
.
Assertions
.
assertThat
;
/**
* Integration tests for {@link JdbcTest}.
*
* @author Phillip Webb
* @author Stephane Nicoll
*/
@RunWith
(
SpringRunner
.
class
)
@JdbcTest
@TestPropertySource
(
properties
=
"spring.test.database.replace=NONE"
)
public
class
JdbcTestWithAutoConfigureTestDatabaseReplacePropertyNoneIntegrationTests
{
@Autowired
private
DataSource
dataSource
;
@Test
public
void
usesDefaultEmbeddedDatabase
()
throws
Exception
{
// HSQL is explicitly defined and should not be replaced
String
product
=
this
.
dataSource
.
getConnection
().
getMetaData
()
.
getDatabaseProductName
();
assertThat
(
product
).
startsWith
(
"HSQL"
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment