简介
一、什么是mock测试,什么是mock对象?
先来看看下面这个示例:
从上图可以看出如果我们要对A进行测试,那么就要先把整个依赖树构建出来,也就是BCDE的实例。
一种替代方案就是使用mocks
从图中可以清晰的看出
mock对象就是在调试期间用来作为真实对象的替代品。
mock测试就是在测试过程中,对那些不容易构建的对象用一个虚拟对象来代替测试的方法就叫mock测试。
知道什么是mock测试后,那么我们就来认识一下mock框架---Mockito
Stub和Mock
相同点:Stub和Mock对象都是用来模拟外部依赖,使我们能控制。
不同点:而stub完全是模拟一个外部依赖,用来提供测试时所需要的测试数据。而mock对象用来判断测试是否能通过,也就是用来验证测试中依赖对象间的交互能否达到预期。在mocking框架中mock对象可以同时作为stub和mock对象使用,两者并没有严格区别。
mockito案例
pom
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <version>1.8.5</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency>
package com.jmock.demo; import org.junit.Test; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.junit.Assert; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatcher; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import static org.mockito.Mockito.*; /** * Created by zhongmin on 2016/9/8. */ public class SimpleTest { @Test public void simpleTest(){ //创建mock对象,参数可以是类,也可以是接口 List<String> list = mock(List.class); //设置方法的预期返回值 when(list.get(0)).thenReturn("helloworld"); String result = list.get(0); //验证方法调用(是否调用了get(0)) verify(list).get(0); //junit测试 Assert.assertEquals("helloworld", result); } @Test public void argumentMatchersTest(){ //创建mock对象 List<String> mock = mock(List.class); //参数匹配,anyInt()匹配任何参数 when(mock.get(anyInt())).thenReturn("hello").thenReturn("world"); String result = mock.get(100)+" "+mock.get(201); //验证方法是否调用2次 verify(mock,times(2)).get(anyInt()); Assert.assertEquals("hello world",result); } @Test public void argumentMatchersAnyTest(){ //创建mock对象 Map mapMock = mock(Map.class); //参数匹配起匹配map参数 when(mapMock.put(anyInt(),anyString())).thenReturn("world"); mapMock.put(1,"hello"); //校验方法是否被调用,注意参数匹配,由于使用了匹配器,verify也要使用匹配器,如下几种用法 // verify(mapMock).put(anyInt(),eq("hello")); //正确 // verify(mapMock).put(eq(1),eq("hello")); //正确 // verify(mapMock).put(eq(1),"hello"); //错误 // verify(mapMock).put(1,"hello"); //正确 // verify(mapMock).put(anyInt(),anyString()); //正确 verify(mapMock).put(1,eq("hello")); //错误 } /** * 参数行为测试 */ @Test public void verifyTestTest(){ List<String> mock = mock(List.class); List<String> mock2 = mock(List.class); mock.get(0); mock.get(1); mock.get(2); mock2.get(0); verify(mock).get(2); verify(mock,never()).get(3); verifyNoMoreInteractions(mock); } /** * Answer接口(方法逾期回调接口) * PS:mock对象的方进行调用预期的设定可以通过thenReturn()来指定返回值,thenThrow()指定返回时所抛异常, * 通常来说这两个方法足以应对一般的需求。 * 但有时我们需要自定义方法执行的返回结果,Answer接口就是满足这样的需求而存在的。 */ @Test public void answerTest(){ List<String> mock = mock(List.class); // when(mock.get(4)).thenAnswer(new CustomAnswer()); doAnswer(new CustomAnswer()).when(mock).clear(); } private class CustomAnswer implements Answer<String>{ @Override public String answer(InvocationOnMock invocation) throws Throwable { Object[] args = invocation.getArguments(); Integer num = (Integer)args[0]; System.out.println("num = "+num); if(num>3 ){ return"yes"; }else{ throw new RuntimeException(); } } } /** * 自定义参数匹配器 */ @Test public void argumentDefMatchersTest(){ List mock = mock(List.class); //设置自定义参数匹配器 when(mock.addAll(argThat(new IsListOfTwoElements()))).thenReturn(true); mock.addAll(Arrays.asList("one","two","three")); verify(mock).addAll(argThat(new IsListOfTwoElements())); } private class IsListOfTwoElements extends ArgumentMatcher<List>{ @Override public boolean matches(Object argument) { return ((List)argument).size()==2; } } @Test public void argumentCaptorTest(){ List mock = mock(List.class); List mock2 = mock(List.class); mock.add("John"); mock2.add("Brian"); mock2.add("Jim"); //实例化参数捕获器 ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(String.class); //捕获输入的参数 verify(mock).add(argumentCaptor.capture()); Assert.assertEquals("John",argumentCaptor.getValue()); //当有多个参数调用,捕获最后输入的参数 verify(mock2,times(2)).add(argumentCaptor.capture()); Assert.assertEquals("Jim",argumentCaptor.getValue()); //捕获所有参数 Assert.assertArrayEquals(new Object[]{"Brian","Jim"},argumentCaptor.getAllValues().toArray()); } @Test public void spyTest(){ List list = new LinkedList(); List spy = spy(list); when(spy.size()).thenReturn(100); spy.add("one"); spy.add("two"); System.out.println(spy.get(0)); System.out.println(spy.size()); verify(spy).add("one"); verify(spy).add("two"); } }
注解DEMO
package com.jmock.demo; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.Spy; import java.util.LinkedList; import java.util.List; import static org.mockito.Mockito.*; /** * Created by zhongmin on 2016/9/9. */ public class MockitoTest { @Mock private List<String> list; @Spy private List<String> spyList = new LinkedList<String>(); @Before public void initMocks(){ MockitoAnnotations.initMocks(this); } @Test public void simpleTest(){ //创建mock对象,参数可以是类,也可以是接口 // List<String> list = mock(List.class); //设置方法的预期返回值 when(list.get(0)).thenReturn("helloworld"); String result = list.get(0); //验证方法调用(是否调用了get(0)) verify(list).get(0); //junit测试 Assert.assertEquals("helloworld", result); } @Test public void spyTest(){ // List list = new LinkedList(); // List spy = spy(list); when(spyList.size()).thenReturn(100); spyList.add("one"); spyList.add("two"); System.out.println(spyList.get(0)); System.out.println(spyList.size()); verify(spyList).add("one"); verify(spyList).add("two"); } }
推荐教程:http://wenku.baidu.com/view/8def451a227916888486d73f.html
相关推荐
Mockit是一种强大的单元测试工具,尤其在Java和JavaScript开发中广泛应用。它允许开发者模拟复杂的对象交互,以便在测试代码时可以独立于实际依赖进行。Mockit资料中的内容可能包括Mockit的基本概念、安装教程、使用...
模拟Mockit 是一个简单的库,用于在测试期间模拟模块依赖项。 其他依赖注入库在测试模块周围创建一个沙箱,迫使用户处理全新的模块上下文。 Mockit 简单地覆盖模拟的依赖项并将模块包含在其原始范围内。安装$ npm ...
vite-plugin-mockit vite的本地模拟数据功能,支持vite 1.x和vite 2.x 简单的写作(express.js风格) 观看文件更改 自动重装模拟服务器 支持cjs样式模块 安装 yarn add vite-plugin-mockit 示例应用 用法 编写一...
莫克特介绍Mockit是Swift 5.0中用于单元测试的美味Mockit框架。 它处于开发的早期阶段,但是其当前功能几乎可以完全使用。 Mockit是一个Mockit框架,味道很棒。 它使您可以使用干净简单的API编写漂亮的测试。 使用...
Mockit 是一个强大的工具,主要用于帮助开发者在与客户端协作时快速创建模拟服务器,以便于在不依赖实际后端服务的情况下进行前端开发和测试。通过模拟服务器,你可以动态地控制返回的数据,模拟各种网络状况,从而...
##使用方法安装nodejs (必须)安装node-mockitsudo npm install -g或者sudo npm install node-mockit -gmkdir ./scriptscli -e > ./scripts/test.jsmock -s ./scripts 即可启动mock服务端服务自己会检测配置脚本的...
jmockit-0.999.2.jar
赠送jar包:mockito-core-4.0.0.jar; 赠送原API文档:mockito-core-4.0.0-javadoc.jar; 赠送源代码:mockito-core-4.0.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-4.0.0.pom; 包含翻译后的API文档:...
在软件开发过程中,单元测试是确保代码质量的重要环节。它允许开发者独立地验证代码的各个部分,确保每个小模块的功能正确无误。然而,有些情况下,正常的单元测试框架可能无法覆盖到所有的情况,比如静态方法和私有...
Java探针技术是一种用于动态分析和调试Java应用程序的工具,它允许开发者在运行时收集程序的行为数据、监控性能、触发事件或改变程序行为。在Java世界中,Mock框架则是单元测试的重要组成部分,它们帮助开发者模拟...
import mockit.Tested; public class UserServiceTest { @Mocked private UserRepository userRepository; @Tested private UserService userService; @Test public void testLogin(@Mocked User user) { ...
- **方法二:使用Mockit.setUpMock()**:另一种创建mock对象的方式。 - **方法三:In-line mock classes**:使用内联mock类进行mock。 - **使用it来访问mock对象本身**:演示如何通过`it`来访问mock对象。 - **...
这些项目涉及到SpringBoot、Mybatis、Xxl-job、RocketMQ、Goanywhere、Mockit、Jacoco、Activity、Flyway、Cicd和SonarQube等技术,显示了他的全栈开发能力和对持续集成/持续交付(CI/CD)流程的理解。 综合来看,...
import mockit.Expectations; import org.junit.Test; public class DatabaseAccessTest { @Mocked private DatabaseConnection dbConnection; // 声明mock对象 @Test public void testGetUserData() { new ...
3. 使用`@RunWith(Mockit.class)`注解标记测试类,以启动JMockit的测试运行器。 4. 定义模拟对象,使用`@Mocked`注解标识。 5. 在测试方法中,使用`new MockUp()`创建模拟上下文,并定义模拟行为。 6. 运行测试方法...
《Spring Cloud Eureka Ribbon与Mybatis、Redis、PageHelper、JUnit、Mockito集成实践》 ...本项目旨在整合一系列常用技术,如Ribbon客户端负载均衡器、Mybatis持久层框架、Redis缓存数据库、PageHelper分页插件,以及...
单元测试是软件开发过程中的重要环节,它允许开发者对代码的各个独立部分进行验证,确保它们按照预期工作。Mock方法则是单元测试中的一个重要工具,用于模拟复杂系统中的依赖关系,以便孤立地测试目标代码。...
MockIt:一种快速创建模拟API的工具。 不再浪费时间嘲笑API。 MockIt为您提供了一个界面,可以为您的应用程序配置和创建REAL模拟终端。 在等待构建APIS的同时,请使用MockIt与真实服务进行对话。 功能:实时重载...
创建mockit 定义的模拟文件后,您只需在模拟文件的根文件夹内运行mockit命令即可启动模拟服务器: $ mockit 默认情况下,该命令将开始在端口9090上提供9090 。 争论 mockit命令有4个可用参数。 [-p | --port] ...