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
571544d1
Commit
571544d1
authored
Dec 20, 2016
by
Phillip Webb
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch '1.5.x'
parents
e248b677
73a45797
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
330 additions
and
20 deletions
+330
-20
MockitoPostProcessor.java
...ramework/boot/test/mock/mockito/MockitoPostProcessor.java
+37
-9
SpyBeanOnTestFieldForExistingGenericBeanIntegrationTests.java
...eanOnTestFieldForExistingGenericBeanIntegrationTests.java
+72
-0
SpyBeanOnTestFieldForMultipleExistingBeansIntegrationTests.java
...nOnTestFieldForMultipleExistingBeansIntegrationTests.java
+73
-0
ExampleGenericStringServiceCaller.java
...ck/mockito/example/ExampleGenericStringServiceCaller.java
+41
-0
SimpleExampleIntegerGenericService.java
...k/mockito/example/SimpleExampleIntegerGenericService.java
+32
-0
SimpleExampleStringGenericService.java
...ck/mockito/example/SimpleExampleStringGenericService.java
+41
-0
LoggingApplicationListener.java
...ingframework/boot/logging/LoggingApplicationListener.java
+1
-6
DefaultLogbackConfiguration.java
...ork/boot/logging/logback/DefaultLogbackConfiguration.java
+21
-5
LoggingApplicationListenerTests.java
...amework/boot/logging/LoggingApplicationListenerTests.java
+12
-0
No files found.
spring-boot-test/src/main/java/org/springframework/boot/test/mock/mockito/MockitoPostProcessor.java
View file @
571544d1
...
@@ -37,6 +37,8 @@ import org.springframework.beans.factory.BeanFactory;
...
@@ -37,6 +37,8 @@ import org.springframework.beans.factory.BeanFactory;
import
org.springframework.beans.factory.BeanFactoryAware
;
import
org.springframework.beans.factory.BeanFactoryAware
;
import
org.springframework.beans.factory.BeanFactoryUtils
;
import
org.springframework.beans.factory.BeanFactoryUtils
;
import
org.springframework.beans.factory.FactoryBean
;
import
org.springframework.beans.factory.FactoryBean
;
import
org.springframework.beans.factory.NoSuchBeanDefinitionException
;
import
org.springframework.beans.factory.NoUniqueBeanDefinitionException
;
import
org.springframework.beans.factory.config.BeanDefinition
;
import
org.springframework.beans.factory.config.BeanDefinition
;
import
org.springframework.beans.factory.config.BeanFactoryPostProcessor
;
import
org.springframework.beans.factory.config.BeanFactoryPostProcessor
;
import
org.springframework.beans.factory.config.BeanPostProcessor
;
import
org.springframework.beans.factory.config.BeanPostProcessor
;
...
@@ -250,7 +252,7 @@ public class MockitoPostProcessor extends InstantiationAwareBeanPostProcessorAda
...
@@ -250,7 +252,7 @@ public class MockitoPostProcessor extends InstantiationAwareBeanPostProcessorAda
createSpy
(
registry
,
definition
,
field
);
createSpy
(
registry
,
definition
,
field
);
}
}
else
{
else
{
registerSpies
(
definition
,
field
,
existingBeans
);
registerSpies
(
registry
,
definition
,
field
,
existingBeans
);
}
}
}
}
...
@@ -307,15 +309,41 @@ public class MockitoPostProcessor extends InstantiationAwareBeanPostProcessorAda
...
@@ -307,15 +309,41 @@ public class MockitoPostProcessor extends InstantiationAwareBeanPostProcessorAda
registerSpy
(
definition
,
field
,
beanName
);
registerSpy
(
definition
,
field
,
beanName
);
}
}
private
void
registerSpies
(
SpyDefinition
definition
,
Field
field
,
private
void
registerSpies
(
BeanDefinitionRegistry
registry
,
SpyDefinition
definition
,
String
[]
existingBeans
)
{
Field
field
,
String
[]
existingBeans
)
{
Assert
.
state
(
field
==
null
||
existingBeans
.
length
==
1
,
ResolvableType
type
=
definition
.
getTypeToSpy
();
"Unable to register spy bean "
+
definition
.
getTypeToSpy
()
try
{
+
" expected a single existing bean to replace but found "
if
(
ObjectUtils
.
isEmpty
(
existingBeans
))
{
+
new
TreeSet
<
String
>(
Arrays
.
asList
(
existingBeans
)));
throw
new
NoSuchBeanDefinitionException
(
type
);
for
(
String
beanName
:
existingBeans
)
{
}
registerSpy
(
definition
,
field
,
beanName
);
if
(
existingBeans
.
length
>
1
)
{
existingBeans
=
new
String
[]
{
determinePrimaryCandidate
(
registry
,
existingBeans
,
type
)
};
}
registerSpy
(
definition
,
field
,
existingBeans
[
0
]);
}
catch
(
RuntimeException
ex
)
{
throw
new
IllegalStateException
(
"Unable to register spy bean "
+
definition
.
getTypeToSpy
(),
ex
);
}
}
private
String
determinePrimaryCandidate
(
BeanDefinitionRegistry
registry
,
String
[]
candidateBeanNames
,
ResolvableType
type
)
{
String
primaryBeanName
=
null
;
for
(
String
candidateBeanName
:
candidateBeanNames
)
{
BeanDefinition
beanDefinition
=
registry
.
getBeanDefinition
(
candidateBeanName
);
if
(
beanDefinition
.
isPrimary
())
{
if
(
primaryBeanName
!=
null
)
{
throw
new
NoUniqueBeanDefinitionException
(
type
.
resolve
(),
candidateBeanNames
.
length
,
"more than one 'primary' bean found among candidates: "
+
Arrays
.
asList
(
candidateBeanNames
));
}
primaryBeanName
=
candidateBeanName
;
}
}
}
return
primaryBeanName
;
}
}
private
void
registerSpy
(
SpyDefinition
definition
,
Field
field
,
String
beanName
)
{
private
void
registerSpy
(
SpyDefinition
definition
,
Field
field
,
String
beanName
)
{
...
...
spring-boot-test/src/test/java/org/springframework/boot/test/mock/mockito/SpyBeanOnTestFieldForExistingGenericBeanIntegrationTests.java
0 → 100644
View file @
571544d1
/*
* 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
.
mock
.
mockito
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.test.mock.mockito.example.ExampleGenericService
;
import
org.springframework.boot.test.mock.mockito.example.ExampleGenericServiceCaller
;
import
org.springframework.boot.test.mock.mockito.example.SimpleExampleIntegerGenericService
;
import
org.springframework.boot.test.mock.mockito.example.SimpleExampleStringGenericService
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Import
;
import
org.springframework.test.context.junit4.SpringRunner
;
import
static
org
.
assertj
.
core
.
api
.
Assertions
.
assertThat
;
import
static
org
.
mockito
.
Mockito
.
verify
;
/**
* Test {@link SpyBean} on a test class field can be used to replace existing beans.
*
* @author Phillip Webb
* @see SpyBeanOnTestFieldForExistingBeanCacheIntegrationTests
*/
@RunWith
(
SpringRunner
.
class
)
public
class
SpyBeanOnTestFieldForExistingGenericBeanIntegrationTests
{
// gh-7625
@SpyBean
private
ExampleGenericService
<
String
>
exampleService
;
@Autowired
private
ExampleGenericServiceCaller
caller
;
@Test
public
void
testSpying
()
throws
Exception
{
assertThat
(
this
.
caller
.
sayGreeting
()).
isEqualTo
(
"I say 123 simple"
);
verify
(
this
.
exampleService
).
greeting
();
}
@Configuration
@Import
({
ExampleGenericServiceCaller
.
class
,
SimpleExampleIntegerGenericService
.
class
})
static
class
SpyBeanOnTestFieldForExistingBeanConfig
{
@Bean
public
ExampleGenericService
<
String
>
simpleExampleStringGenericService
()
{
// In order to trigger issue we need a method signature that returns the
// generic type not the actual implementation class
return
new
SimpleExampleStringGenericService
();
}
}
}
spring-boot-test/src/test/java/org/springframework/boot/test/mock/mockito/SpyBeanOnTestFieldForMultipleExistingBeansIntegrationTests.java
0 → 100644
View file @
571544d1
/*
* 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
.
mock
.
mockito
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
org.mockito.internal.util.MockUtil
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.test.mock.mockito.example.ExampleGenericStringServiceCaller
;
import
org.springframework.boot.test.mock.mockito.example.SimpleExampleStringGenericService
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Import
;
import
org.springframework.context.annotation.Primary
;
import
org.springframework.test.context.junit4.SpringRunner
;
import
static
org
.
assertj
.
core
.
api
.
Assertions
.
assertThat
;
import
static
org
.
mockito
.
Mockito
.
verify
;
/**
* Test {@link SpyBean} on a test class field can be used to inject new spy instances.
*
* @author Phillip Webb
*/
@RunWith
(
SpringRunner
.
class
)
public
class
SpyBeanOnTestFieldForMultipleExistingBeansIntegrationTests
{
@SpyBean
private
SimpleExampleStringGenericService
spy
;
@Autowired
private
ExampleGenericStringServiceCaller
caller
;
@Test
public
void
testSpying
()
throws
Exception
{
assertThat
(
this
.
caller
.
sayGreeting
()).
isEqualTo
(
"I say two"
);
assertThat
(
new
MockUtil
().
getMockName
(
this
.
spy
).
toString
()).
isEqualTo
(
"two"
);
verify
(
this
.
spy
).
greeting
();
}
@Configuration
@Import
(
ExampleGenericStringServiceCaller
.
class
)
static
class
Config
{
@Bean
public
SimpleExampleStringGenericService
one
()
{
return
new
SimpleExampleStringGenericService
(
"one"
);
}
@Bean
@Primary
public
SimpleExampleStringGenericService
two
()
{
return
new
SimpleExampleStringGenericService
(
"two"
);
}
}
}
spring-boot-test/src/test/java/org/springframework/boot/test/mock/mockito/example/ExampleGenericStringServiceCaller.java
0 → 100644
View file @
571544d1
/*
* 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
.
mock
.
mockito
.
example
;
/**
* Example bean for mocking tests that calls {@link ExampleGenericService}.
*
* @author Phillip Webb
*/
public
class
ExampleGenericStringServiceCaller
{
private
final
ExampleGenericService
<
String
>
stringService
;
public
ExampleGenericStringServiceCaller
(
ExampleGenericService
<
String
>
stringService
)
{
this
.
stringService
=
stringService
;
}
public
ExampleGenericService
<
String
>
getStringService
()
{
return
this
.
stringService
;
}
public
String
sayGreeting
()
{
return
"I say "
+
this
.
stringService
.
greeting
();
}
}
spring-boot-test/src/test/java/org/springframework/boot/test/mock/mockito/example/SimpleExampleIntegerGenericService.java
0 → 100644
View file @
571544d1
/*
* 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
.
mock
.
mockito
.
example
;
/**
* Example generic service implementation for spy tests.
*
* @author Phillip Webb
*/
public
class
SimpleExampleIntegerGenericService
implements
ExampleGenericService
<
Integer
>
{
@Override
public
Integer
greeting
()
{
return
123
;
}
}
spring-boot-test/src/test/java/org/springframework/boot/test/mock/mockito/example/SimpleExampleStringGenericService.java
0 → 100644
View file @
571544d1
/*
* 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
.
mock
.
mockito
.
example
;
/**
* Example generic service implementation for spy tests.
*
* @author Phillip Webb
*/
public
class
SimpleExampleStringGenericService
implements
ExampleGenericService
<
String
>
{
private
final
String
greeting
;
public
SimpleExampleStringGenericService
()
{
this
(
"simple"
);
}
public
SimpleExampleStringGenericService
(
String
greeting
)
{
this
.
greeting
=
greeting
;
}
@Override
public
String
greeting
()
{
return
this
.
greeting
;
}
}
spring-boot/src/main/java/org/springframework/boot/logging/LoggingApplicationListener.java
View file @
571544d1
...
@@ -316,12 +316,7 @@ public class LoggingApplicationListener implements GenericApplicationListener {
...
@@ -316,12 +316,7 @@ public class LoggingApplicationListener implements GenericApplicationListener {
}
}
private
boolean
ignoreLogConfig
(
String
logConfig
)
{
private
boolean
ignoreLogConfig
(
String
logConfig
)
{
return
!
StringUtils
.
hasLength
(
logConfig
)
return
!
StringUtils
.
hasLength
(
logConfig
)
||
logConfig
.
startsWith
(
"-D"
);
||
isDefaultAzureLoggingConfig
(
logConfig
);
}
private
boolean
isDefaultAzureLoggingConfig
(
String
candidate
)
{
return
candidate
.
startsWith
(
"-Djava.util.logging.config.file="
);
}
}
private
void
initializeFinalLoggingLevels
(
ConfigurableEnvironment
environment
,
private
void
initializeFinalLoggingLevels
(
ConfigurableEnvironment
environment
,
...
...
spring-boot/src/main/java/org/springframework/boot/logging/logback/DefaultLogbackConfiguration.java
View file @
571544d1
...
@@ -16,6 +16,7 @@
...
@@ -16,6 +16,7 @@
package
org
.
springframework
.
boot
.
logging
.
logback
;
package
org
.
springframework
.
boot
.
logging
.
logback
;
import
java.lang.reflect.Method
;
import
java.nio.charset.Charset
;
import
java.nio.charset.Charset
;
import
ch.qos.logback.classic.Level
;
import
ch.qos.logback.classic.Level
;
...
@@ -35,6 +36,7 @@ import org.springframework.boot.logging.LoggingInitializationContext;
...
@@ -35,6 +36,7 @@ import org.springframework.boot.logging.LoggingInitializationContext;
import
org.springframework.core.env.Environment
;
import
org.springframework.core.env.Environment
;
import
org.springframework.core.env.PropertyResolver
;
import
org.springframework.core.env.PropertyResolver
;
import
org.springframework.core.env.PropertySourcesPropertyResolver
;
import
org.springframework.core.env.PropertySourcesPropertyResolver
;
import
org.springframework.util.ReflectionUtils
;
/**
/**
* Default logback configuration used by Spring Boot. Uses {@link LogbackConfigurator} to
* Default logback configuration used by Spring Boot. Uses {@link LogbackConfigurator} to
...
@@ -128,22 +130,36 @@ class DefaultLogbackConfiguration {
...
@@ -128,22 +130,36 @@ class DefaultLogbackConfiguration {
encoder
.
setPattern
(
OptionHelper
.
substVars
(
logPattern
,
config
.
getContext
()));
encoder
.
setPattern
(
OptionHelper
.
substVars
(
logPattern
,
config
.
getContext
()));
appender
.
setEncoder
(
encoder
);
appender
.
setEncoder
(
encoder
);
config
.
start
(
encoder
);
config
.
start
(
encoder
);
appender
.
setFile
(
logFile
);
appender
.
setFile
(
logFile
);
getRollingPolicy
(
appender
,
config
,
logFile
);
getMaxFileSize
(
appender
,
config
);
config
.
appender
(
"FILE"
,
appender
);
return
appender
;
}
private
void
getRollingPolicy
(
RollingFileAppender
<
ILoggingEvent
>
appender
,
LogbackConfigurator
config
,
String
logFile
)
{
FixedWindowRollingPolicy
rollingPolicy
=
new
FixedWindowRollingPolicy
();
FixedWindowRollingPolicy
rollingPolicy
=
new
FixedWindowRollingPolicy
();
rollingPolicy
.
setFileNamePattern
(
logFile
+
".%i"
);
rollingPolicy
.
setFileNamePattern
(
logFile
+
".%i"
);
appender
.
setRollingPolicy
(
rollingPolicy
);
appender
.
setRollingPolicy
(
rollingPolicy
);
rollingPolicy
.
setParent
(
appender
);
rollingPolicy
.
setParent
(
appender
);
config
.
start
(
rollingPolicy
);
config
.
start
(
rollingPolicy
);
}
private
void
getMaxFileSize
(
RollingFileAppender
<
ILoggingEvent
>
appender
,
LogbackConfigurator
config
)
{
SizeBasedTriggeringPolicy
<
ILoggingEvent
>
triggeringPolicy
=
new
SizeBasedTriggeringPolicy
<
ILoggingEvent
>();
SizeBasedTriggeringPolicy
<
ILoggingEvent
>
triggeringPolicy
=
new
SizeBasedTriggeringPolicy
<
ILoggingEvent
>();
triggeringPolicy
.
setMaxFileSize
(
FileSize
.
valueOf
(
"10MB"
));
try
{
triggeringPolicy
.
setMaxFileSize
(
FileSize
.
valueOf
(
"10MB"
));
}
catch
(
NoSuchMethodError
ex
)
{
// Logback < 1.1.8 used String configuration
Method
method
=
ReflectionUtils
.
findMethod
(
SizeBasedTriggeringPolicy
.
class
,
"setMaxFileSize"
,
String
.
class
);
ReflectionUtils
.
invokeMethod
(
method
,
triggeringPolicy
,
"10MB"
);
}
appender
.
setTriggeringPolicy
(
triggeringPolicy
);
appender
.
setTriggeringPolicy
(
triggeringPolicy
);
config
.
start
(
triggeringPolicy
);
config
.
start
(
triggeringPolicy
);
config
.
appender
(
"FILE"
,
appender
);
return
appender
;
}
}
}
}
spring-boot/src/test/java/org/springframework/boot/logging/LoggingApplicationListenerTests.java
View file @
571544d1
...
@@ -164,6 +164,18 @@ public class LoggingApplicationListenerTests {
...
@@ -164,6 +164,18 @@ public class LoggingApplicationListenerTests {
assertThat
(
new
File
(
tmpDir
()
+
"/spring.log"
).
exists
()).
isFalse
();
assertThat
(
new
File
(
tmpDir
()
+
"/spring.log"
).
exists
()).
isFalse
();
}
}
@Test
public
void
tomcatNopLoggingConfigDoesNotCauseAFailure
()
throws
Exception
{
TestPropertySourceUtils
.
addInlinedPropertiesToEnvironment
(
this
.
context
,
"logging.config: -Dnop"
);
this
.
initializer
.
initialize
(
this
.
context
.
getEnvironment
(),
this
.
context
.
getClassLoader
());
this
.
logger
.
info
(
"Hello world"
);
String
output
=
this
.
outputCapture
.
toString
().
trim
();
assertThat
(
output
).
contains
(
"Hello world"
).
doesNotContain
(
"???"
);
assertThat
(
new
File
(
tmpDir
()
+
"/spring.log"
).
exists
()).
isFalse
();
}
@Test
@Test
public
void
overrideConfigBroken
()
throws
Exception
{
public
void
overrideConfigBroken
()
throws
Exception
{
TestPropertySourceUtils
.
addInlinedPropertiesToEnvironment
(
this
.
context
,
TestPropertySourceUtils
.
addInlinedPropertiesToEnvironment
(
this
.
context
,
...
...
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