前言:
描述两种场景
场景一:类A有两个方法:funA和funB,funA调用funB,其中funA需要执行真正的方法,funB需要mock
场景二:类A被spy了,类B被mock了,类A依赖类B(即类B需要注入到类A),下面就写一下这两种场景的解决办法
场景一
解决思路:
1,类A classA = spy(new 类A)
2,doReturn(返回值).when(classA).funB(Mockito.anyObject());
3,classA.funA(参数)
场景二
解决思路:
1,类A classA = spy(new 类A)
2,类B classB = mock(类B.class)
3,类B注入到类A // 借助AopTestUtils
- 类A classAReal = AopTestUtils.getTargetObject(classA);
- ReflectionTestUtils.setField(classAReal, "classB",classB); //第二个参数为类B在类A中的属性名称
4,mock B类返回
doReturn(返回值).when(classB).funB(Matchers.anyObject());
5,A类执行真正方法
classA.funA(参数);
[注] 引入AopTestUtils工具
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
类A classAReal = AopTestUtils.getTargetObject(classA);
ReflectionTestUtils.setField(classAReal, "classB",classB); //第二个参数为类B在类A中的属性名称
参考
【1】Mockito的使用(二)——@InjectMocks、@Spy、@Mock
【2】关于spring-test包中ReflectionTestUtils反射测试工具类对springframework中ReflectionUtils进行代码测试
【3】通过AopTestUtils对切面对象进行mock
网友评论