zoukankan      html  css  js  c++  java
  • Mockito (一)

    Mocktio 入门

    Mockito 是一个模拟测试框架。主要功能是模拟类/对象的行为。

    Mockito 一般用于控制调用外部的返回值,让我们只关心和测试自己的业务逻辑

    我们看一个示例:

    package demo;
    
    import java.util.Random;
    
    public class HttpService {
    
        public int queryStatus() {
            // 发起网络请求,提取返回结果
            // 这里用随机数模拟结果
            return new Random().nextInt(2);
        }
    
    }
    package demo;
    
    public class ExampleService {
    
        private HttpService httpService;
    
        public void setHttpService(HttpService httpService) {
            this.httpService = httpService;
        }
    
        public String hello() {
            int status = httpService.queryStatus();
            if (status == 0) {
                return "你好";
            }
            else if (status == 1) {
                return "Hello";
            }
            else {
                return "未知状态";
            }
        }
    
    }

    使用示例:

    package demo;
    
    public class Main {
    
        public static void main(String[] args) {
            HttpService realHttpService = new HttpService();
            ExampleService exampleService = new ExampleService();
            exampleService.setHttpService(realHttpService);
            System.out.println( exampleService.hello() );
        }
    }

    每次运行的结果可能不同,可能是你好,也可能是Hello

    现在我们引入 mockito。如果是用 gradle 构建 gradle 项目,加入以下依赖:

    dependencies {
        testCompile group: 'junit', name: 'junit', version: '4.12'
        testCompile group: 'org.mockito', name: 'mockito-core', version: '2.25.1'
    }

    注意,我们引入了 junit 来编写断言。断言是测试的核心。

    整个项目结构如下:

    ├── build.gradle
    ├── settings.gradle
    └── src
        ├── main
        │   ├── java
        │   │   └── demo
        │   │       ├── HttpService.java
        │   │       ├── Main.java
        │   │       └── ExampleService.java
        │   └── resources
        └── test
            ├── java
            │   └── demo
            │       └── ExampleServiceTest.java
            └── resources

    其中 test 目录下的 ExampleServiceTest 类,是我们新增的测试类:

    package demo;
    
    import org.junit.Assert;
    import org.junit.Test;
    import static org.mockito.Mockito.mock;
    import static org.mockito.Mockito.when;
    
    
    public class ExampleServiceTest {
    
        @Test
        public void test() {
            // 创建mock对象
            HttpService mockHttpService = mock(HttpService.class);
            // 使用 mockito 对 queryStatus 方法打桩
            when(mockHttpService.queryStatus()).thenReturn(1);
            // 调用 mock 对象的 queryStatus 方法,结果永远是 1
            Assert.assertEquals(1, mockHttpService.queryStatus());
    
            ExampleService exampleService = new ExampleService();
            exampleService.setHttpService(mockHttpService);
            Assert.assertEquals("Hello", exampleService.hello() );
        }
    
    }

    我们通过 mock 函数生成了一个 HttpService 的 mock 对象(这个对象是动态生成的)。

    通过 when .. thenReturn 指定了当调用 mock对象的 queryStatus 方法时,返回 1 ,这个叫做打桩

    然后将 mock 对象注入到 exampleService 中,exampleService.hello() 的返回永远是 Hello

    转载:https://www.letianbiji.com/java-mockito/mockito-hello-world.html

    核心类Mockito文档可参考:https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html

    带着疑问去思考,然后串联,进而归纳总结,不断追问自己,进行自我辩证,像侦查嫌疑案件一样看待技术问题,漆黑的街道,你我一起寻找线索,你就是技术界大侦探福尔摩斯
  • 相关阅读:
    事务管理思考
    sleep、yield、wait的区别
    线程异常
    线程
    JAVA线程中断
    volatile synchronized在线程安全上的区别
    jms amqp activemq rabbitmq的区别
    servlet不是线程安全的
    雪花算法
    个人税收申报时候对于“全年一次性奖金“的处理
  • 原文地址:https://www.cnblogs.com/cainiao-Shun666/p/14804303.html
Copyright © 2011-2022 走看看