Mockito mock Kotlin Object类方法报错解决方法

Mockito mock Kotlin Object类方法报错解决方法主要是解决在Kotlin编写的程序中使用Mockito进行测试时,对一个Kotlin的Object类的方法进行Mock时报错的问题。以下是完整攻略:

问题描述

在Kotlin编写的程序中,有一个Object类,比如:

object MyObject {
    fun doSomething(): String = "do something"
}

现在我们想要对该Object类的doSomething()方法进行Mock,代码如下:

import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.InjectMocks
import org.mockito.Mock
import org.mockito.junit.MockitoJUnitRunner

@RunWith(MockitoJUnitRunner::class)
class MyObjectTest {

    @InjectMocks
    lateinit var myObject: MyObject

    @Mock
    lateinit var myMock: MyObject

    @Test
    fun testDoSomething() {
        `when`(myMock.doSomething()).thenReturn("mock something")
        assertEquals("mock something", myObject.doSomething())
    }

}

此时可以发现,在使用Mockito进行测试时,报错了:

org.mockito.exceptions.base.MockitoException: 
Cannot mock/spy class com.example.MyObject$Companion
Mockito cannot mock/spy following:
  - final classes
  - anonymous classes
  - primitive types, final methods or classes

解决方法

解决方法主要是在Mockito的Mock语句中使用PowerMockito,步骤如下:

  1. 在build.gradle文件中添加以下依赖:
testImplementation 'org.powermock:powermock-module-junit4:2.0.9'
testImplementation 'org.powermock:powermock-api-mockito2:2.0.9'
  1. 在测试类中使用@RunWith()注解和@PrepareForTest()注解:
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.InjectMocks
import org.mockito.Mock
import org.mockito.junit.MockitoJUnitRunner
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.PowerMockRunner

@RunWith(PowerMockRunner::class)
@PrepareForTest(MyObject::class)
class MyObjectTest {

    @InjectMocks
    lateinit var myObject: MyObject

    @Mock
    lateinit var myMock: MyObject

    @Test
    fun testDoSomething() {
        PowerMockito.mockStatic(MyObject::class.java)
        `when`(MyObject.doSomething()).thenReturn("mock something")
        assertEquals("mock something", myObject.doSomething())
    }

}

此时,再次运行测试即可通过。

注意事项

  1. 在测试类中使用@RunWith(PowerMockRunner::class)注解,而不是@RunWith(MockitoJUnitRunner::class)注解;
  2. 在测试类中使用@PrepareForTest(MyObject::class)注解,参数是需要Mock的Kotlin Object类名;
  3. 在Mockito的Mock语句中使用PowerMockito,例如:PowerMockito.mockStatic(MyObject::class.java);
  4. 在Mockito的Mock语句中使用Kotlin Object名来进行Mock,例如:when(MyObject.doSomething()).thenReturn("mock something")。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mockito mock Kotlin Object类方法报错解决方法 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • go语言csrf库使用实现原理示例解析

    首先让我们解释一下什么是CSRF(Cross-site request forgery),它是一种网络攻击方式,攻击者可以通过伪装成受信任的用户来执行未经授权的操作。为了防止这种攻击,我们需要在应用程序中实现CSRF保护。 Go语言提供了一些库来帮助我们实现CSRF保护。常用的有gorilla/csrf和net/http包中的csrf。接下来分别针对这两个库…

    GitHub 2023年5月16日
    00
  • Android编程使用android-support-design实现MD风格对话框功能示例

    给您详细讲解一下。 Android编程使用android-support-design实现MD风格对话框功能示例攻略 本篇攻略主要介绍如何使用 android-support-design 库,实现 MD 风格的对话框功能,以及两个对话框实例的演示。 前置条件:- 熟悉 Android 开发以及 Android Studio 工具的使用;- 已经配置好了an…

    GitHub 2023年5月16日
    00
  • 55分钟学会正则表达式(来自Github)

    55分钟学会正则表达式(来自Github)- 完整攻略 正则表达式是一种强大的文本处理工具,它可以对文本进行高效的搜索、匹配和替换等任务。本文介绍的是一篇开源项目Github上的“55分钟学会正则表达式”的完整攻略。该攻略通过简单易懂的语言和实例来让初学者快速入门正则表达式的使用。 第一步:正则表达式基础知识 本攻略将简要介绍正则表达式中的基础元字符。这些元…

    GitHub 2023年5月16日
    00
  • Angular CLI 使用教程指南参考小结

    「Angular CLI 使用教程指南参考小结」是一篇介绍如何使用 Angular CLI 工具的指南,其中包含了许多步骤以及示例说明,下面我们将一步一步详细讲解。 1. 环境搭建 在开始使用 Angular CLI 之前,我们需要先搭建好环境,具体步骤如下: 安装 Node.js 和 NPM 安装 Angular CLI 创建新项目 2. 创建新项目 我们…

    GitHub 2023年5月16日
    00
  • Git 常用命令速查表(图文+表格)

    Git 常用命令速查表是 Git 新手必备的参考工具,学会使用 Git 常用命令可以帮助我们更高效地进行版本控制,保证项目的稳定性和可维护性。这篇攻略将会详细讲解 Git 常用命令速查表中的各个命令,以及示例说明。 Git 常用命令速查表 以下是常用的 Git 命令速查表: 命令 说明 git init 初始化 Git 仓库,在当前目录下创建 .git 文件…

    GitHub 2023年5月16日
    00
  • Spring Cloud OpenFeign 远程调用

    下面是 Spring Cloud OpenFeign 远程调用的完整攻略以及两条示例说明。 什么是 Spring Cloud OpenFeign? Spring Cloud OpenFeign 是 Spring Cloud 生态圈中的一款轻量级的 HTTP 客户端组件,它可以用来简化 HTTP 请求客户端的开发。Spring Cloud OpenFeign …

    GitHub 2023年5月16日
    00
  • 你真的了解虚拟专用网络吗?还是先顾着自己的隐私再说吧

    当提到虚拟专用网络(Virtual Private Network,VPN)时,我们通常会提到隐私和数据安全等话题。在本文中,我们将介绍VPN以及为什么使用VPN对于隐私和数据安全至关重要。 什么是虚拟专用网络(VPN)? VPN是一个安全加密的网络连接方式。通常情况下,VPN会将您的互联网流量从您的设备加密,并通过VPN服务商的服务器转发到目标网站或服务器…

    GitHub 2023年5月16日
    00
  • 关于JSqlparser使用攻略(高效的SQL解析工具)

    关于JSqlparser使用攻略包含以下内容: 1. 什么是JSqlparser JSqlparser是开源的Java SQL语句解析器,能够解析各种SQL语句,例如SELECT、INSERT、UPDATE、DELETE、UPSERT等语句,并将其转化为Java对象表示。它可以轻松地将SQL语句转化为Java对象,对于对SQL语句进行处理,修改或转化为其他语…

    GitHub 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部