一、为什么要使用Mockito

1.实际案例

1.1 遇到的问题

对于经常维护的项目,经常遇到一个实际问题:需求不停改变,导致架构经常需要修改某些概念的定义。

对于某些十分基础又十分常用的概念,常常牵一发而动全身。

此时,"重构-测试"循环将会消耗比较多的费用。

1.2 解决方法1

可以通过领域驱动开发,在设计架构之前和相关领域的专家充分沟通,从而从一开始就得到准确的定义。

同时,在开发过程中对于之后有可能增加新功能的模块,充分增加其可拓展性。

1.2 解决方法2

通过编写高质量代码,保证单一功能由单一函数负责,从而减少增加新功能时的工作量。

1.3 根本原因

不论架构怎样设计,对于一个经常维护、更新的项目,其必然会在某些时刻遇到修改基本定义的情况。

而这些基本定义的大量引用,对于一名普通开发者来说,不一定能完全照顾到。

即使照顾到了,也不能保证下一次也同样不出问题。

1.4 解决方法3

使用自动化测试,在增加代码后用计算机代替人进行功能测试,从而大大提高测试效率。

在引入单元测试后,不仅能测试出“是否有问题”,更能高效找到错误出现的位置,效率显著高于传统的控制台输出调试方法。

2.行为驱动开发

2.1 概览

BDD:行为驱动开发

第一步:编写一个失败的"客户验收测试",从客户视角描述系统。

第二步:写系统代码,直到验收测试通过。

2.2 缺点

代码量大,前期成本高。

即该方法不适合一次性写完,之后几乎不维护的小型程序。

2.3 优点

后期开发效率大大提高。

因此,该方法适用于时常维护,使用时间很长的大型程序。

二、部署Mockito

1.gradle部署

build.gradle.kts

dependencies {
testImplementation("org.mockito:mockito-core:4.3.1")
testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.2")
testImplementation("org.mockito:mockito-inline:4.3.1")
testImplementation(fileTree("testLibs"))
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.2")
}

注意:testLibs可以改成任意文件夹名,这个文件夹放入你的外部依赖(如spigot的jar)

2.在哪里写测试代码

import org.junit.jupiter.api.Test;

public class TestStarter {

    @Test
public void test(){
TestCore.INSTANCE.test();
} }

3.ClassFormatError

这是因为你看起来导入了API,实际上没有导入好。

解决方法:把API(如Spigot)的jar文件放入testLibs(或你自己的文件夹名)

SpigotAPI下载地址:https://hub.spigotmc.org/nexus/content/repositories/snapshots/org/spigotmc/spigot-api/

4.ClassNotFoundError

这是因为你没有导入API。

解决方法:testImplementation("你需要的依赖"),示例如下

    testImplementation("io.izzel.taboolib:common:6.0.10-11")
testImplementation("io.izzel.taboolib:module-configuration:6.0.10-11")

三、使用方法

1.mock

用来创建一个虚假的对象,如Player。

val player= Mockito.mock(Player::class.java)

这个对象的类型就是Player,可以传递给别的方法,并且可以自定义触发player的方法时,执行和返回的内容。

2.when ... then ...

2.1 when ... thenReturn ...

val player=mock(Player::class.java)
`when`(player.name).thenReturn(playerName)
val playerLocation= mock(Location::class.java)
`when`(playerLocation.x).thenReturn(0.0)
`when`(playerLocation.y).thenReturn(0.0)
`when`(playerLocation.z).thenReturn(0.0)

这个方法可以用来指定返回值。

2.2 anyString()

对于有参数的方法,可以设定不论传入什么参数,都return特定值。

anyInt()等同理。

val map= Mockito.mock(ConfigFile::class.java)
Mockito.`when`(map.getString(anyString())).thenReturn("Test")

2.3.thenAnswer

有时候,我们设置了anyString()之后,想使用实际传入的参数,就需要thenAnswer()。

arguments即为传入的实际参数。

Mockito.`when`(map.getString(anyString())).thenAnswer { invocation ->
val args = invocation.arguments
var str = args[0] as String
fakeMap.getString(str)
}

Mockito使用方法(Kotlin)的更多相关文章

  1. java太low,又舍不得jvm平台的丰富资源?试试kotlin吧(一)

    尝试kotlin的起因 因为各种原因(版权,人员招聘),公司的技术体系从c#转到了java,我花了大概两周的时间来上手java,发现java的语法还是非常简单的,基本看着代码就知道什么意思.学习jav ...

  2. mock测试框架Mockito

    无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访 ...

  3. MockMvc和Mockito之酷炫使用

    由于项目中需要添加单元测试,所以查询之后发现Mockito非常适合现在的web项目. 首先需要添加pom依赖: <dependency> <groupId>junit</ ...

  4. JUnit + Mockito 单元测试(二)(good)

    import org.junit.Test; import org.mockito.Matchers; import org.mockito.Mockito; import java.util.Lis ...

  5. kotlin的方言(语法糖)

    概述 之前介绍了kotlin的快速入门,http://www.cnblogs.com/lizo/p/7231167.html 大多数还是参照java.kotlin中提供了更多更方便的语言特性 这个方言 ...

  6. Kotlin技术入门以及和Java对比.md

    一.Kotlin基础环境搭建 Android studio的版本大于3.0 直接支持Kotlin语法,直接创建即可; Android studio的版本小于3.0,步骤如下: 需要下载插件 插件搜索 ...

  7. Java单元测试神器之Mockito

    什么是 Mock 测试 Mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.什么是不容易构造的对象呢?例如HttpServletReques ...

  8. kotlin语法使用笔记

    kotlin中文文档:http://www.kotlindoc.cn/ClassesAndObjects/Classes-and-Inheritance.html 1. 声明类的构造方法 例如继承Fr ...

  9. Kotlin中的object 与companion object的区别

    之前写了一篇Kotlin中常量和静态方法的文章,最近有人提出一个问题,在companion object中调用外部的成员变量会调用不到,这才意识到问题,本篇文章会带着这个疑问来解决问题. 一. obj ...

随机推荐

  1. LuoguP2575 高手过招(博弈论)

    空格数变吗?不变呀 阶梯博弈阶梯数变吗?不变呀 那这不就阶梯博弈,每行一栋楼,爬完\(mex\)就可以了吗? #include <iostream> #include <cstdio ...

  2. Taurus.MVC 微服务框架 入门开发教程:项目集成:1、服务端:注册中心、网关(提供可运行程序下载)。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  3. 简单概述因特网(Internet)

    学习目的 了解 Internet 的概念,区别因特网与互联网. 了解 Internet 的基本结构. 了解 Internet 的发展历史. Internet 概念 因特网(Internet)是全球性的 ...

  4. 你言我语 By Twikoo

    主要做了两件事: 一是前端魔改 二是首页调用(替代原 bber) 注明:以下样式.功能代码基于 Twikoo v1.6.4 前端魔改 "管理面板"按钮同步隐藏输入框.先到twiko ...

  5. 用maven创建ssm框架样版

    在pom.xml中添加依赖包 特别要注意导入的"org.springframework"的版本,不兼容会报错 <!--依赖:junit ,数据库驱动,连接池,servlet, ...

  6. CF-1562B- Scenes From a Memory

    Problem - 1562B - Codeforces 题意:给定一个字符串,每次操作可以选择这个字符串中的一种字符,将他们全部都减1,最多K次操作,问可以形成的字典大小最小的字符串. 题解:首先我 ...

  7. JDK 自带的服务发现框架 ServiceLoader 好用吗?

    请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 Github · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...

  8. SpringBoot源码学习1——SpringBoot自动装配源码解析+Spring如何处理配置类的

    系列文章目录和关于我 一丶什么是SpringBoot自动装配 SpringBoot通过SPI的机制,在我们程序员引入一些starter之后,扫描外部引用 jar 包中的META-INF/spring. ...

  9. 阿里云OSS存储前端API上传(签名上传)

    一.创建用户 在阿里云创建用户https://ram.console.aliyun.com/users,并勾选Open API 保存好信息,很重要,返回后就再也找不到了 新增授权(这里视个人情况,需要 ...

  10. SQL 时间范围和时间粒度

    前言 使用 SQL 进行业务数据计算时,经常会遇到两个概念:时间范围 和 时间粒度 .以 最近一天的每小时的用户访问人数 为例: 最近一天 是时间范围 每小时 是时间粒度 常见的时间范围:最近五分钟. ...