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
ba6fe601
Commit
ba6fe601
authored
Aug 23, 2019
by
Andy Wilkinson
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch '2.1.x'
Closes gh-17948
parents
2d2e3b3d
52050c17
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
127 additions
and
3 deletions
+127
-3
MockitoPostProcessor.java
...ramework/boot/test/mock/mockito/MockitoPostProcessor.java
+14
-3
SpyBeanOnTestFieldForExistingScopedBeanIntegrationTests.java
...BeanOnTestFieldForExistingScopedBeanIntegrationTests.java
+113
-0
No files found.
spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/mock/mockito/MockitoPostProcessor.java
View file @
ba6fe601
...
@@ -27,6 +27,7 @@ import java.util.Map;
...
@@ -27,6 +27,7 @@ import java.util.Map;
import
java.util.Set
;
import
java.util.Set
;
import
java.util.TreeSet
;
import
java.util.TreeSet
;
import
org.springframework.aop.scope.ScopedObject
;
import
org.springframework.aop.scope.ScopedProxyUtils
;
import
org.springframework.aop.scope.ScopedProxyUtils
;
import
org.springframework.beans.BeansException
;
import
org.springframework.beans.BeansException
;
import
org.springframework.beans.PropertyValues
;
import
org.springframework.beans.PropertyValues
;
...
@@ -357,6 +358,9 @@ public class MockitoPostProcessor extends InstantiationAwareBeanPostProcessorAda
...
@@ -357,6 +358,9 @@ public class MockitoPostProcessor extends InstantiationAwareBeanPostProcessorAda
Assert
.
state
(
ReflectionUtils
.
getField
(
field
,
target
)
==
null
,
Assert
.
state
(
ReflectionUtils
.
getField
(
field
,
target
)
==
null
,
()
->
"The field "
+
field
+
" cannot have an existing value"
);
()
->
"The field "
+
field
+
" cannot have an existing value"
);
Object
bean
=
this
.
beanFactory
.
getBean
(
beanName
,
field
.
getType
());
Object
bean
=
this
.
beanFactory
.
getBean
(
beanName
,
field
.
getType
());
if
(
bean
instanceof
ScopedObject
)
{
bean
=
((
ScopedObject
)
bean
).
getTargetObject
();
}
ReflectionUtils
.
setField
(
field
,
target
,
bean
);
ReflectionUtils
.
setField
(
field
,
target
,
bean
);
}
}
catch
(
Throwable
ex
)
{
catch
(
Throwable
ex
)
{
...
@@ -442,15 +446,22 @@ public class MockitoPostProcessor extends InstantiationAwareBeanPostProcessorAda
...
@@ -442,15 +446,22 @@ public class MockitoPostProcessor extends InstantiationAwareBeanPostProcessorAda
@Override
@Override
public
Object
getEarlyBeanReference
(
Object
bean
,
String
beanName
)
throws
BeansException
{
public
Object
getEarlyBeanReference
(
Object
bean
,
String
beanName
)
throws
BeansException
{
return
this
.
mockitoPostProcessor
.
createSpyIfNecessary
(
bean
,
beanName
);
return
this
.
mockitoPostProcessor
.
createSpyIfNecessary
(
bean
,
getOriginalBeanNameIfScopedTarget
(
beanName
)
);
}
}
@Override
@Override
public
Object
postProcessAfterInitialization
(
Object
bean
,
String
beanName
)
throws
BeansException
{
public
Object
postProcessAfterInitialization
(
Object
bean
,
String
beanName
)
throws
BeansException
{
if
(
bean
instanceof
FactoryBean
)
{
if
(
bean
instanceof
FactoryBean
||
bean
instanceof
ScopedObject
)
{
return
bean
;
return
bean
;
}
}
return
this
.
mockitoPostProcessor
.
createSpyIfNecessary
(
bean
,
beanName
);
return
this
.
mockitoPostProcessor
.
createSpyIfNecessary
(
bean
,
getOriginalBeanNameIfScopedTarget
(
beanName
));
}
private
String
getOriginalBeanNameIfScopedTarget
(
String
beanName
)
{
if
(
ScopedProxyUtils
.
isScopedTarget
(
beanName
))
{
return
beanName
.
substring
(
"scopedTarget."
.
length
());
}
return
beanName
;
}
}
static
void
register
(
BeanDefinitionRegistry
registry
)
{
static
void
register
(
BeanDefinitionRegistry
registry
)
{
...
...
spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/mock/mockito/SpyBeanOnTestFieldForExistingScopedBeanIntegrationTests.java
0 → 100644
View file @
ba6fe601
/*
* Copyright 2012-2019 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
*
* https://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.jupiter.api.Test
;
import
org.junit.jupiter.api.extension.ExtendWith
;
import
org.springframework.beans.factory.ObjectFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.config.CustomScopeConfigurer
;
import
org.springframework.boot.test.mock.mockito.SpyBeanOnTestFieldForExistingScopedBeanIntegrationTests.SpyBeanOnTestFieldForExistingScopedBeanConfig
;
import
org.springframework.boot.test.mock.mockito.example.ExampleService
;
import
org.springframework.boot.test.mock.mockito.example.ExampleServiceCaller
;
import
org.springframework.boot.test.mock.mockito.example.SimpleExampleService
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Import
;
import
org.springframework.context.annotation.Scope
;
import
org.springframework.context.annotation.ScopedProxyMode
;
import
org.springframework.test.context.ContextConfiguration
;
import
org.springframework.test.context.junit.jupiter.SpringExtension
;
import
static
org
.
assertj
.
core
.
api
.
Assertions
.
assertThat
;
import
static
org
.
mockito
.
Mockito
.
verify
;
/**
* Test {@link SpyBean @SpyBean} on a test class field can be used to replace existing
* scoped beans.
*
* @author Andy Wilkinson
*/
@ExtendWith
(
SpringExtension
.
class
)
@ContextConfiguration
(
classes
=
SpyBeanOnTestFieldForExistingScopedBeanConfig
.
class
)
public
class
SpyBeanOnTestFieldForExistingScopedBeanIntegrationTests
{
@SpyBean
private
ExampleService
exampleService
;
@Autowired
private
ExampleServiceCaller
caller
;
@Test
void
testSpying
()
{
assertThat
(
this
.
caller
.
sayGreeting
()).
isEqualTo
(
"I say simple"
);
verify
(
this
.
exampleService
).
greeting
();
}
@Configuration
(
proxyBeanMethods
=
false
)
@Import
({
ExampleServiceCaller
.
class
})
static
class
SpyBeanOnTestFieldForExistingScopedBeanConfig
{
@Bean
@Scope
(
scopeName
=
"custom"
,
proxyMode
=
ScopedProxyMode
.
TARGET_CLASS
)
SimpleExampleService
simpleExampleService
()
{
return
new
SimpleExampleService
();
}
@Bean
static
CustomScopeConfigurer
customScopeConfigurer
()
{
CustomScopeConfigurer
configurer
=
new
CustomScopeConfigurer
();
configurer
.
addScope
(
"custom"
,
new
org
.
springframework
.
beans
.
factory
.
config
.
Scope
()
{
private
Object
bean
;
@Override
public
Object
resolveContextualObject
(
String
key
)
{
throw
new
UnsupportedOperationException
();
}
@Override
public
Object
remove
(
String
name
)
{
throw
new
UnsupportedOperationException
();
}
@Override
public
void
registerDestructionCallback
(
String
name
,
Runnable
callback
)
{
throw
new
UnsupportedOperationException
();
}
@Override
public
String
getConversationId
()
{
throw
new
UnsupportedOperationException
();
}
@Override
public
Object
get
(
String
name
,
ObjectFactory
<?>
objectFactory
)
{
if
(
this
.
bean
==
null
)
{
this
.
bean
=
objectFactory
.
getObject
();
}
return
this
.
bean
;
}
});
return
configurer
;
}
}
}
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