Mockito使用方法(Kotlin)()

  本篇文章为你整理了Mockito使用方法(Kotlin)()的详细内容,包含有 Mockito使用方法(Kotlin),希望能帮助你了解 Mockito使用方法(Kotlin)。

  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即为传入的实际参数。如果原方法返回值为void,return@thenAnswer null即可。

  

Mockito.`when`(map.getString(anyString())).thenAnswer { invocation - 

 

   val args = invocation.arguments

   var str = args[0] as String

   fakeMap.getString(str)

  

 

  2.4 @BeforeAll

  作用:在@test执行之前,进行初始化

  

@BeforeAll

 

   public static void prepare(){

   ConfigData.map=FakeConfigManager.INSTANCE.getMap();

   }

 

  2.5MockedStatic

  方法1(自定义程度高)

  输出:at xx.TestCore.test(TestCore.kt:18) invoke method: getWorld with arguments: [world] return type: org.bukkit.World

  

Mockito.mockStatic(Bukkit::class.java) { invocation: InvocationOnMock - 

 

   val args = invocation.arguments // 调用方法的参数

   val mock = invocation.mock // 被mock的静态类的class信息,不是静态类本身

   val method = invocation.method // 被调用的具体方法

   val location =

   (invocation as InterceptedInvocation).location

   .toString() // 调用具体位置

   println(

   location + " invoke method: " + method.name

   + " with arguments: " + Arrays.toString(args)

   + " return type: " + method.returnType.name

   if (method.name == "getWorld") {

   return@mockStatic null

   null

  

 

  方法2(简单)(java代码)

  

MockedStatic ConfigData configData = Mockito.mockStatic(ConfigData.class);

 

  configData.when(ConfigData.INSTANCE::getMap).thenReturn("");

  

 

  以上就是Mockito使用方法(Kotlin)()的详细内容,想要了解更多 Mockito使用方法(Kotlin)的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: