Mockito使用方法(Kotlin)
一、为什么要使用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)的更多相关文章
- java太low,又舍不得jvm平台的丰富资源?试试kotlin吧(一)
尝试kotlin的起因 因为各种原因(版权,人员招聘),公司的技术体系从c#转到了java,我花了大概两周的时间来上手java,发现java的语法还是非常简单的,基本看着代码就知道什么意思.学习jav ...
- mock测试框架Mockito
无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访 ...
- MockMvc和Mockito之酷炫使用
由于项目中需要添加单元测试,所以查询之后发现Mockito非常适合现在的web项目. 首先需要添加pom依赖: <dependency> <groupId>junit</ ...
- JUnit + Mockito 单元测试(二)(good)
import org.junit.Test; import org.mockito.Matchers; import org.mockito.Mockito; import java.util.Lis ...
- kotlin的方言(语法糖)
概述 之前介绍了kotlin的快速入门,http://www.cnblogs.com/lizo/p/7231167.html 大多数还是参照java.kotlin中提供了更多更方便的语言特性 这个方言 ...
- Kotlin技术入门以及和Java对比.md
一.Kotlin基础环境搭建 Android studio的版本大于3.0 直接支持Kotlin语法,直接创建即可; Android studio的版本小于3.0,步骤如下: 需要下载插件 插件搜索 ...
- Java单元测试神器之Mockito
什么是 Mock 测试 Mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.什么是不容易构造的对象呢?例如HttpServletReques ...
- kotlin语法使用笔记
kotlin中文文档:http://www.kotlindoc.cn/ClassesAndObjects/Classes-and-Inheritance.html 1. 声明类的构造方法 例如继承Fr ...
- Kotlin中的object 与companion object的区别
之前写了一篇Kotlin中常量和静态方法的文章,最近有人提出一个问题,在companion object中调用外部的成员变量会调用不到,这才意识到问题,本篇文章会带着这个疑问来解决问题. 一. obj ...
随机推荐
- Android Studio 模拟器(AVD)访问互联网
模拟器默认是不可以直接访问互联网的,需要为模拟器配置 DNS 服务器. (一)找到模拟器安装的位置 模拟器安装位置在安卓 SDK 下面,进入[SDK Path]/emulator. (二)打开终端输入 ...
- Linux 安装 Tomcat 详细教程
Linux 安装Tomcat详细步骤 1. 前往tomcat官网复制下载链接, tomcat官网地址:https://tomcat.apache.org/ 2. 进入到指定目录,使用 wget 命令下 ...
- linux 3.10 一个扇区异常可能引发的hung
最近遇到一例3.10内核的crash: [ 4109.682163] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" d ...
- RabbitMQ 入门系列:3、基础编码:官方SDK的引用、链接创建、单例改造、发送消息、接收消息。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- 中国剩余定理+扩展中国剩余定理 讲解+例题(HDU1370 Biorhythms + POJ2891 Strange Way to Express Integers)
0.引子 每一个讲中国剩余定理的人,都会从孙子的一道例题讲起 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二.问物几何? 1.中国剩余定理 引子里的例题实际上是求一个最小的x满足 关键是,其中 ...
- C++ IO流_数据的旅行之路
1. 前言 程序中的数据总是在流动着,既然是流动就会有方向.数据从程序的外部流到程序内部,称为输入:数据从程序内部流到外部称为输出. C++提供有相应的API实现程序和外部数据之间的交互,统称这类AP ...
- win10+Android(华为)系统原生日历同步方案+Sol日历桌面显示
前言:本文是参考了其他博客基础上,新增了Android的免费桌面[月试图显示]功能.以及适配于上海交通大学的Canvas教学日历.方便进行多设备同步的日历管理.任务提醒. 目录 1.效果展示 2.方案 ...
- CodeForces - 1625C
Problem - 1625C - Codeforces 题意: 一条马路,有n个限速牌,表示的是从这个限速牌开始到下一个限速牌或者到马路尾的这段距离的速度,你可以拆除其中k个限速牌,问最少的时间是多 ...
- 第九十九篇:JS闭包
好家伙,总是要来的,去面对那些晦涩难懂的原理,它就在那里,等着我去搞定它 首先我要去补充一些最基本的概念, 1.什么是内存? 新华字典永远的神, 但这个解释显然不够 去看看百度百科: 内存: CP ...
- Mybatis 一级缓存和二级缓存原理区别 (图文详解)
Java面试经常问到Mybatis一级缓存和二级缓存,今天就给大家重点详解Mybatis一级缓存和二级缓存原理与区别@mikechen Mybatis缓存 缓存就是内存中的数据,常常来自对数据库查询结 ...