一、为什么要使用Mockito1.实际案例1.1 遇到的问题对于经常维护的项目,经常遇到一个实际问题:需求不停改变,导致架构经常需要修改某些概念的定义 。
对于某些十分基础又十分常用的概念,常常牵一发而动全身 。
此时,"重构-测试"循环将会消耗比较多的费用 。
1.2 解决方法1可以通过领域驱动开发,在设计架构之前和相关领域的专家充分沟通,从而从一开始就得到准确的定义 。
同时,在开发过程中对于之后有可能增加新功能的模块 , 充分增加其可拓展性 。
1.2 解决方法2通过编写高质量代码 , 保证单一功能由单一函数负责 , 从而减少增加新功能时的工作量 。
1.3 根本原因不论架构怎样设计,对于一个经常维护、更新的项目,其必然会在某些时刻遇到修改基本定义的情况 。
而这些基本定义的大量引用,对于一名普通开发者来说 , 不一定能完全照顾到 。
即使照顾到了,也不能保证下一次也同样不出问题 。
1.4 解决方法3使用自动化测试,在增加代码后用计算机代替人进行功能测试,从而大大提高测试效率 。
在引入单元测试后,不仅能测试出“是否有问题” , 更能高效找到错误出现的位置,效率显著高于传统的控制台输出调试方法 。
2.行为驱动开发2.1 概览BDD:行为驱动开发
第一步:编写一个失败的"客户验收测试",从客户视角描述系统 。
第二步:写系统代码 , 直到验收测试通过 。
2.2 缺点代码量大,前期成本高 。
即该方法不适合一次性写完,之后几乎不维护的小型程序 。
2.3 优点后期开发效率大大提高 。
因此 , 该方法适用于时常维护,使用时间很长的大型程序 。
二、部署Mockito1.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 {@Testpublic 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.argumentsvar str = args[0] as StringfakeMap.getString(str)}【Kotlin Mockito使用方法】
推荐阅读
- 华为freebuds4i使用方法_华为freebuds4i怎么重新配对
- beatsflex使用教程_beatsflex使用方法
- 支付宝使用方法(支付宝怎么绑银行卡)
- 爱国者手机u盘怎么用(爱国者的u盘使用方法)
- 小米盒子使用方法(小米盒子4永久vip)
- 【对讲机怎么用】对讲机正确使用方法(对讲机如何正确使用)
- 对讲机怎么用对讲机使用方法图解(对讲机喊话键下面俩键干什么用的)
- 对讲机怎么正确使用(中继对讲机使用方法图解)
- 我的世界附魔书使用方法我的世界附魔书怎么用
- 花呗的使用方法详细步骤(怎么设置优先使用花呗)