`

mockit

阅读更多

简介

一、什么是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资料,自用

    Mockit是一种强大的单元测试工具,尤其在Java和JavaScript开发中广泛应用。它允许开发者模拟复杂的对象交互,以便在测试代码时可以独立于实际依赖进行。Mockit资料中的内容可能包括Mockit的基本概念、安装教程、使用...

    mockit:简单的模块依赖模拟

    模拟Mockit 是一个简单的库,用于在测试期间模拟模块依赖项。 其他依赖注入库在测试模块周围创建一个沙箱,迫使用户处理全新的模块上下文。 Mockit 简单地覆盖模拟的依赖项并将模块包含在其原始范围内。安装$ npm ...

    vite-plugin-mockit:快速插件模拟

    vite-plugin-mockit vite的本地模拟数据功能,支持vite 1.x和vite 2.x 简单的写作(express.js风格) 观看文件更改 自动重装模拟服务器 支持cjs样式模块 安装 yarn add vite-plugin-mockit 示例应用 用法 编写一...

    Mockit:Swift的简单模拟框架,灵感来自著名的http

    莫克特介绍Mockit是Swift 5.0中用于单元测试的美味Mockit框架。 它处于开发的早期阶段,但是其当前功能几乎可以完全使用。 Mockit是一个Mockit框架,味道很棒。 它使您可以使用干净简单的API编写漂亮的测试。 使用...

    mockit:与客户端一起快速创建模拟服务器以动态控制它

    Mockit 是一个强大的工具,主要用于帮助开发者在与客户端协作时快速创建模拟服务器,以便于在不依赖实际后端服务的情况下进行前端开发和测试。通过模拟服务器,你可以动态地控制返回的数据,模拟各种网络状况,从而...

    node-mockit:模拟HTTP API使用Node.js

    ##使用方法安装nodejs (必须)安装node-mockitsudo npm install -g或者sudo npm install node-mockit -gmkdir ./scriptscli -e &gt; ./scripts/test.jsmock -s ./scripts 即可启动mock服务端服务自己会检测配置脚本的...

    jmockit\jmockit-0.999.2.jar

    jmockit-0.999.2.jar

    mockito-core-4.0.0-API文档-中英对照版.zip

    赠送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文档:...

    利用PowerMock模拟静态方法和私有方法的示例

    在软件开发过程中,单元测试是确保代码质量的重要环节。它允许开发者独立地验证代码的各个部分,确保每个小模块的功能正确无误。然而,有些情况下,正常的单元测试框架可能无法覆盖到所有的情况,比如静态方法和私有...

    基于Java探针的Mock框架.zip

    Java探针技术是一种用于动态分析和调试Java应用程序的工具,它允许开发者在运行时收集程序的行为数据、监控性能、触发事件或改变程序行为。在Java世界中,Mock框架则是单元测试的重要组成部分,它们帮助开发者模拟...

    JMockit学习分享

    import mockit.Tested; public class UserServiceTest { @Mocked private UserRepository userRepository; @Tested private UserService userService; @Test public void testLogin(@Mocked User user) { ...

    Step By Step写测试(书签版).pdf

    - **方法二:使用Mockit.setUpMock()**:另一种创建mock对象的方式。 - **方法三:In-line mock classes**:使用内联mock类进行mock。 - **使用it来访问mock对象本身**:演示如何通过`it`来访问mock对象。 - **...

    5年5年5年5年5年5年5年5年5年5年

    这些项目涉及到SpringBoot、Mybatis、Xxl-job、RocketMQ、Goanywhere、Mockit、Jacoco、Activity、Flyway、Cicd和SonarQube等技术,显示了他的全栈开发能力和对持续集成/持续交付(CI/CD)流程的理解。 综合来看,...

    jmockit-1.2

    import mockit.Expectations; import org.junit.Test; public class DatabaseAccessTest { @Mocked private DatabaseConnection dbConnection; // 声明mock对象 @Test public void testGetUserData() { new ...

    jmockit-1.6.zip

    3. 使用`@RunWith(Mockit.class)`注解标记测试类,以启动JMockit的测试运行器。 4. 定义模拟对象,使用`@Mocked`注解标识。 5. 在测试方法中,使用`new MockUp()`创建模拟上下文,并定义模拟行为。 6. 运行测试方法...

    spring-cloudEurekaRibbon:spring-cloudRibbon集成mybatis、redis、pageHelper、junit、mockit单元测试,多数据源配置

    《Spring Cloud Eureka Ribbon与Mybatis、Redis、PageHelper、JUnit、Mockito集成实践》 ...本项目旨在整合一系列常用技术,如Ribbon客户端负载均衡器、Mybatis持久层框架、Redis缓存数据库、PageHelper分页插件,以及...

    单元测试与 Mock 方法

    单元测试是软件开发过程中的重要环节,它允许开发者对代码的各个独立部分进行验证,确保它们按照预期工作。Mock方法则是单元测试中的一个重要工具,用于模拟复杂系统中的依赖关系,以便孤立地测试目标代码。...

    模拟:一种工具,可以快速模拟出端点,设置延迟等。

    MockIt:一种快速创建模拟API的工具。 不再浪费时间嘲笑API。 MockIt为您提供了一个界面,可以为您的应用程序配置和创建REAL模拟终端。 在等待构建APIS的同时,请使用MockIt与真实服务进行对话。 功能:实时重载...

    cli-api-mocker:CLI连接器,用于connect-api-mocker

    创建mockit 定义的模拟文件后,您只需在模拟文件的根文件夹内运行mockit命令即可启动模拟服务器: $ mockit 默认情况下,该命令将开始在端口9090上提供9090 。 争论 mockit命令有4个可用参数。 [-p | --port] ...

Global site tag (gtag.js) - Google Analytics