简记Mock测试框架
MOCK (模拟,模仿)
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.5.11</version>
<scope>test</scope>
</dependency>
-
mock的目的和作用: 模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与测试边界以外的对象隔离开,类似于容器。
-
Mockito实现原理: 通过CGLib在运行时为每一个被mock的类或者对象动态生成一个代理对象,返回预先设计的结果。
-
Stub打桩: 即在Mockito中使用when().thenReturn()这种语法来定义对象方法和参数输入,并且制定结果输出
- 对于static和final方法,不能进行打桩操作,
- 如果连续对同一个方法打桩,则只会使用最新的一次。
集成Mockito的基本步骤
- 标记被Mock的类或者对象,生成代理对象
- 通过Mockito API定制代理对象的行为
- 调用代理 对象的方法,获得预先设计的结果
Mockito框架的具体步骤
- 初始化mock的对象
-
在测试类前注解 @RunWith(MockitoJUnitRunner.class)
-
在@Mock注解的对象后,以及@Test注解之前声明 @Before public void setUp( ) throws Exception{ MockitoAnnotations.initMocks(this); }
- 上述两种初始化方式二选一即可
-
mock对象的使用
-
Mockito.when(...).thenReturn(...); //打桩, 当when中的方法以及指定的输入执行时,会直接返回指定的内容,而其他被mock的方法以及其他输入都会直接返回默认值;
-
Mockito.when (...).thenCallRealMethod(... ); //此时会执行被Mock对象中的真实方法并且按照其实际执行返回结果
-
验证调用次数:
Mockito.verify(mockObject,Mockito.times()).methodName(anyString()); //验证methodName方法执行了多少次
-
验证调用顺序:
InOrder inOrder = Mockito.inOrder(mockObject); inOrder.verify(mockObject).methodName(); inOrder.verify(mockObject).methodName();
-
局部模拟
通过Mockito.spy() 生成可局部模拟的对象,其余情况都保持真实情况,例如有一个类Hello,有 Hello spy=Mockito.spy(new Hello() ) //生成局部模拟对象 Mockito.when(spy.method2("sss")).thenReturn("gg"); //实际执行,但是返回的时候被替换了 assertEquals("gg", spy.method2("sss")); //模拟执行并返回 assertEquals("s2", spy.method2("s")); //按照真实情况执行并返回
并不执行方法,而是按照指定返回值返回
Mockito.doReturn(....).when(spy).method(....);
-