首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MockK:验证使用父类的特定子类类型的参数调用函数

MockK是一个用于Kotlin语言的轻量级模拟框架,用于进行单元测试和集成测试。它可以帮助开发人员模拟对象的行为,以便更好地测试代码的正确性和可靠性。

在给定的问答内容中,MockK可以用于验证使用父类的特定子类类型的参数调用函数。具体来说,MockK可以模拟一个对象,并验证该对象的方法是否以特定的参数被调用。

以下是使用MockK进行验证的步骤:

  1. 导入MockK库:在项目的构建文件中添加MockK库的依赖。
  2. 创建模拟对象:使用MockK的mockk()函数创建一个模拟对象。
  3. 设置模拟对象的行为:使用MockK的every函数来设置模拟对象的方法调用和返回值。
  4. 调用被测试的函数:调用被测试的函数,并将模拟对象作为参数传递给该函数。
  5. 验证模拟对象的方法调用:使用MockK的verify函数来验证模拟对象的方法是否以特定的参数被调用。

下面是一个示例代码,演示了如何使用MockK验证使用父类的特定子类类型的参数调用函数:

代码语言:txt
复制
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify

open class ParentClass
class ChildClass : ParentClass()

interface SomeInterface {
    fun doSomething(obj: ParentClass)
}

class MyClass(private val someInterface: SomeInterface) {
    fun myFunction(obj: ParentClass) {
        someInterface.doSomething(obj)
    }
}

fun main() {
    val mockInterface = mockk<SomeInterface>()
    val myClass = MyClass(mockInterface)
    val childObj = ChildClass()

    every { mockInterface.doSomething(ofType<ChildClass>()) } returns Unit

    myClass.myFunction(childObj)

    verify { mockInterface.doSomething(childObj) }
}

在上面的示例中,我们创建了一个ParentClass和一个继承自ParentClassChildClass。然后,我们定义了一个SomeInterface接口,其中包含一个接受ParentClass类型参数的doSomething方法。接下来,我们创建了一个MyClass类,该类接受一个实现了SomeInterface接口的对象作为构造函数参数,并在myFunction方法中调用了doSomething方法。

main函数中,我们使用MockK创建了一个SomeInterface的模拟对象mockInterface。然后,我们使用every函数设置了当doSomething方法以ChildClass类型的参数被调用时,返回Unit。接下来,我们调用了myClassmyFunction方法,并将childObj作为参数传递给该方法。最后,我们使用verify函数验证了mockInterfacedoSomething方法是否以childObj参数被调用。

这样,我们就可以使用MockK验证使用父类的特定子类类型的参数调用函数。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云函数计算(云函数):https://cloud.tencent.com/product/scf
  • 腾讯云API网关(API网关):https://cloud.tencent.com/product/apigateway
  • 腾讯云容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务(TBaaS):https://cloud.tencent.com/product/tbaas
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iot
  • 腾讯云移动开发(移动推送):https://cloud.tencent.com/product/umeng
  • 腾讯云音视频通信(TRTC):https://cloud.tencent.com/product/trtc
  • 腾讯云云原生应用引擎(TKE Serverless):https://cloud.tencent.com/product/tke-serverless
  • 腾讯云云原生数据库(TDSQL):https://cloud.tencent.com/product/tdsql
  • 腾讯云云原生存储(TCS):https://cloud.tencent.com/product/tcs
  • 腾讯云云原生安全(云安全中心):https://cloud.tencent.com/product/ssc
  • 腾讯云云原生网络(私有网络):https://cloud.tencent.com/product/vpc
  • 腾讯云云原生区块链(区块链服务):https://cloud.tencent.com/product/baas
  • 腾讯云云原生元宇宙(腾讯云元宇宙):https://cloud.tencent.com/product/tencent-meta-universe
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

返回子类类型函数写法

不过由于我们这个 Event 类型比较多,因此希望写一个,来一个子类感受下: class DisposableEventBuilder : EventBuilder() { private....build() 我们调用 retryLimit 方法后,想要设置下 delay,结果发现没有这个方法。 “我 X,这什么玩意儿”,你嘟囔了一句。 因为返回,所以链式调用掉链子了。...this.retryLimit = retryLimit return this as T } abstract fun build(): PollingEvent } 这个泛型给加了一个泛型参数...,这个参数则必须是当前子类,那么这样的话我们就可以在返回自身类型位置返回 T 这个类型了。...子类改动就很简单了,只需要给加一个泛型参数为自己类型即可: class DisposableEventBuilder : EventBuilder

4.8K10

python 子类调用构造函数实例

子类继承后,需要调用方法和属性时,需要调用初始化函数。...,但新构造函数没有初始化,当没有初始化构造函数时,就会报错。...super函数返回一个super对象,解析过程自动查找所有的,当前和对象可以作为super函数参数使用调用函数返回方法是超方法。...使用super函数如果子类继承多个只许一次继承,使用一次super函数即可。 如果没有重写子类构造函数,是可以直接使用属性和方法。...以上这篇python 子类调用构造函数实例就是小编分享给大家全部内容了,希望能给大家一个参考。

3.5K30
  • Python_子类调用方法

    注意一点,在子类内部通过继承方式调用属性时,必须要带上self位置参数(self只在实例化过程中和在实例调用属性时才能省略(self本来含义就是指向实例自己));而实例在通过继承调用属性或方法时...该部分代码块如下:注意一点,在子类内部通过继承方式调用属性时,必须要带上self位置参数(self只在实例化过程中和在实例调用属性时才能省略(self本来含义就是指向实例自己));而实例在通过继承调用属性或方法时...def __init__(self,name,age,sex,classnaem): #子类调用构造函数进行初始化 Person....使用super好处,一是可以代替父名,这样后期名更改了,我们只需要更改子类名称后面的名即可,子类中其他名可以不用更改;二是使用了super后,调用方法时可以不传参数self。...__init__(self,name,age,sex) #通过子类参数传给(self不能少,self只有在实例化和实例调用时才能省略,此处不是) #使用super来替换

    4.8K20

    子类调用同名方法和属性

    Python面向对象中,利用子类调用同名方法和属性。...首先我们定义了两个,Master和School # @author: 北山啦 # FileName: 12子类调用同名方法 # @time: 2022/6/5 14:54 #Master...,子类如何来调用呢 在这里,定义Prentice,继承了Master和School,添加了和类同名属性和方法 调用子类属性和方法 如果调用属性和方法,类属性会自动掩盖子类属性,股灾调用属性前...__init__ print(f'运用{self.kongfu}制作煎饼果子') 调用类属性和方法 如果调用方法,但是为了保障调用属性,必须在方法前调用初始化...__init__ print(f'运用{self.kongfu}制作煎饼果子') '''调用方法,但是为了保障调用是弗列属性,必须在方法前调用初始化'''

    1.8K20

    创建子类对象时,构造函数调用子类重写方法为什么调用子类方法?

    static void main(String[] args) { A a = new A(); B b = new B(); } } 问题:为什么创建A对象时候调用子类方法...但是:创建B对象调用方法? 答案: 当子类被加载到内存方法区后,会继续加载到内存中。...如果,子类重写了方法,子类方法引用会指向子类方法,否则子类方法引用会指向方法引用。 如果子类重载了方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载方法,则方法引用会指向方法。 当子类对象创建时,会先行调用构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...其结果是当编译时候,构造方法调用方法参数已经强制转换为符合方法参数了。 上边代码在编译前已经转换为下面这个样子了。

    6.2K10

    Java中子类调用关系

    3、每个直接或间接是Object子类,Object只有一个无参构造方法。...3、每个直接或间接是Object子类,Object只有一个无参构造方法。   4、编译器会在每个构造方法第一行隐式添加默认无参构造器,即添加super()。   ...Must explicitly invoke another constructo   因为定义了一个带参数构造器,因此编译器不会添加默认无参构造方法,但是因为在子类构造器中没有显式调用某个构造方法...Teacher() {   super(10);   }   }   这样,在子类构造器中显式调用某个构造器,所以编译器不会自动添加super()方法。   ...,然后首先调用super()方法,调用Teacher无参构造方法,接着再调用 Employee无参构造方法,最后再调用Object无参构造方法。

    97830

    Java中子类构造函数

    参考链接: Java中继承和构造函数 这篇文章总结了关于Java构造常见​​问题。  1)为什么创建一个子类对象要也需要调用构造函数? ...如果没有,编译器会插入调用构造语句。这就是为什么在创建子类对象时构造超函数会被调用。  这里没有创建两个对象,只有一个子对象。...这是上边Super发生情况。  子类构造函数,无论有参构造还是无参构造,将会调用默认无参构造函数。...3)子类显式调用构造函数  下面的代码是正常:    子类(Sub)构造函数显式地调用(Super)中带参构造参数。如果中定义了相对应构造函数,那将会被正常良好调用。  ...4)规则 简而言之,规则是:子类构造函数必须调用构造函数,无论隐式调用还是显式调用,无论哪种方式,被调用构造函数必须得先被定义。

    2.2K20

    Java中加载机制---子类多态调用

    null 1) 上面程序最大难点,也是最重要地方就是:在构造函数调用了虚函数,并且这个函数子类重载了 2) 继承时候,子类有着同名属性和同名方法,关于同名属性初始化过程也是必须要了解...3) 构造时候,Java机制是到底先给属性分配空间并赋值,还是先处理 构造函数,换句话说,当我们使用new操作符生成一个对象实例时候,加载机制是怎么样, 如果这三个问题都搞定了,都理解了,...;同名方法是多态,只会去调用子类重载方法, 这个规则说白了,就是当有子类时候,必须都所有的存储空间都分配好了,才能执行  属性初始化,继而是构造函数;同时要明白一点,子类构造函数是在构造完成之后才会去执行...执行初始化操作,在栈内存里面写上内容base,上面的为分配地址变量  指向  这个栈内存 6)接下来是做构造函数,完成实例化,构造函数里面的代码是执行了一个虚函数,这个时候首先要看子类有没有重载这个函数...,多态调用 7)子类有重载,所以调用子类方法,但是子类baseName还没有初始化,所以就没有直接打出null了 8)创建完毕,接下来就是去执行子类创建工作了, 9)首先为子类属性进行初始化

    2.8K40

    Python实现子类调用初始化实例

    前言 python中进行面向对象编程,当在子类实例中调用属性时,由于子类__init__方法重写了__init__方法,如果在子类中这些属性未经过初始化,使用时就会出错。...***方式进行调用。但是如果通过名直接调用方法,self参数就不会被自动绑定到实例上,可以绑定到我们指定实例上。也就是子类实例上,在这里就是B了。...方法二:调用super函数 super函数是用于调用一个方法,主要是用于解决多继承问题,避免多继承带来一些问题,当然也可以用来解决单继承问题,调用__init__方法了。...– 方法一简单直观,但面对多继承问题,只能多次调用每个__init__方法 – 方法二不太直观,但可以解决多继承问题,会一次性执行所有的对应方法 所以实际使用时,按照自己需要选择一个就行了...以上这篇Python实现子类调用初始化实例就是小编分享给大家全部内容了,希望能给大家一个参考。

    2K20

    python中子类调用初始化方法

    继承后,就能调用方法和访问类属性,而要完成整个集成过程,子类是需要调用构造函数。...子类不显式调用构造方法,而构造函数初始化了一些属性,就会出现问题 如果子类都有构造函数子类其实是重写了构造函数,如果不显式调用构造函数构造函数就不会被执行,导致子类实例访问初始化方法中初始变量就会出现问题...,直接使用名称调用其构造函数即可。...当前雷和对象可以作为super函数参数使用调用函数返回对象任何方法都是调用方法,而不是当前方法。...方法一更直观,方法二可以一次初始化所有超 super函数比在超累中直接调用未绑定方法更直观,但是其最大有点是如果子类继承了多个,它只需要使用一次super函数就可以。

    2.2K10

    子类A继承B, A a = new A(); 则B构造函数B静态代码块、B非静态代码块、子类A构造函数子类A静态代码块、子类A非静态代码块 执行先后顺序是?

    (1)子类A继承B, A a = new A(); 则: B静态代码块->子类A静态代码块->B非静态代码块->B构造函数->子类A非静态代码块->子类A构造函数 (2)若子类构造函数中显式调用某构造函数...,则调用该构造函数 class C { C() { System.out.print("C"); } } class A { C c = new C();...,那么就要调用构造方法来初始化该子类对象,但是该类继承自A,所以要先调用构造方法,这里通过super(“B”)显示调用带参构造。...执行带参构造前要先对对象进行初始化,对c成员进行初始化,调用了C无参构造,所以调用顺序为: 先调用C无参构造 再调用A带参构造 最后调用调用子类构造 (3...顺序为:静态变量, 静态代码块 ,子类静态变量,子类静态代码块。

    2.1K30

    【C++】继承 ⑥ ( 继承中构造函数和析构函数 | 类型兼容性原则 | 指针 指向 子类对象 | 使用 子类对象 为 对象 进行初始化 )

    " 私有继承 " 派生 , 是 不具有 基 完整功能 , 因为 最终继承 后派生 , 无法在 外部调用 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则...// 对象 可以调用 公有函数 parent.funParent(); // 子类对象 可以调用 子类自身公有函数 child.funChild();...// 子类对象 可以调用 公有函数 child.funParent(); // 将指向子类对象指针传给接收指针函数 // 也是可以 fun_pointer...// 通过指针调用函数 p_parent->funParent(); // 将指向子类对象指针传给接收指针函数 // 也是可以 fun_pointer...类型兼容性原则 : 指针 指向 子类对象 Parent* p_parent2 = NULL; p_parent2 = &child; // 通过指针调用函数

    28220

    【Kotlin】Kotlin 继承 三 ( super 关键字使用 | super@ 外部调用方法 | 子类选择性调用 接口 方法 super )

    子类重写方法 : 如果属性 或 方法被子类重写了 , 那么就需要使用 super 关键字调用类属性或方法 ; 4 . super 关键字调用需要考虑情况 : ① 常用情况 : 最常用情况只使用...super 关键字进行简单调用即可 ; ② 子类内部类调用 : 如果想要在子类内部调用成员和方法 , 需要使用 super@子类名称 调用 ; ③ 子类调用不同父同名方法 : 如果子类继承.../ 实现接口有相同名称属性 / 方法 , 就需要使用 super 形式调用指定 / 接口方法 ; II ....子类内部类调用方法 ( super@ ) ---- 子类内部类调用方法 : 在子类内部类中 , 如果想要访问方法 , 可以使用 super@子类名称.方法() 形式 , 调用方法...子类选择性调用 / 接口方法 : 子类可以继承 , 实现多个接口 , 如果与接口 , 或者不同接口之间定义了相同名称方法 , 那么需要使用 super.方法名() 选择调用指定

    1.5K10

    【C++】多态 ⑥ ( 函数重定义涉及问题 - 子类覆盖函数名 )

    , 子类 会 覆盖 函数名称 ; 执行 Child c; c.fun(1, 2, 3); 代码 , 尝试调用 3 个参数 fun 函数 , 出现错误 , 报错 : error...C2661: “Child::fun”: 没有重载函数接受 3 个参数 ; 该错误是编译阶段报错误 , 编译根本通不过 ; 3、错误原因分析 - 函数重定义问题 : 子类覆盖函数名 错误原因分析...: 函数重定义 带来问题 , 子类覆盖函数名 ; 函数重定义函数名称覆盖问题 : C++ 编译器 发现 Child c 对象要调用 void fun(int a, int b, int c) 函数..., 子类中已经存在 fun 函数了 , 子类 会 覆盖 函数名 , C++ 编译器只会在 子类查找 该函数 , 不会去 查找 ; 子类查找函数 : C++ 编译器 在 子类中找到了 void...: 没有重载函数接受 3 个参数 ; 4、正确调用函数方法 在这种情况下 , 由于子类 重定义了部分 重载函数 , 导致 函数名被覆盖 , 此时需要使用 域操作符 访问 被覆盖函数

    17720

    【C++】类型转换 ④ ( 子类 之间类型转换 - 动态类型转换 dynamic_cast )

    , 分析 C++ 环境下 使用 各种方式 进行 子类 类型之间转换 , 推荐使用 动态类型转换 dynamic_cast ; 一、子类 之间类型转换 - 动态类型转换 dynamic_cast...指针形参 作为参数 , 如果调用函数 , 传入子类指针 , 此时涉及到将 子类指针 Son* 隐式转为 指针 Father* ; // 函数接收 对象 作为参数, 可传入子类对象 void...Son2 子类特有函数 void son2_say() { cout << "son2_say" << endl; } }; // 函数接收 对象 作为参数, 可传入子类对象 void...objSay(Father* obj) { // 调用 纯虚函数 可发生多态调用 // 传入不同子类 调用是不同函数 obj->say(); } int main() { Son...; // 函数接收 对象 作为参数, 可传入子类对象 void objSay(Father* obj) { // 调用 纯虚函数 可发生多态调用 // 传入不同子类 调用是不同函数

    49310

    子类对象获取值方式验证,通过类属性方式获取不到值,需要使用get方法

    子类对象获取值方式验证,通过类属性方式获取不到值,需要使用get方法 静态属性通过.属性方式获取,对象获取使用get方法获取 package com.example.core.mydemo.java...String channelName) { this.channelName = channelName; } /** * partnerName: //通过类属性方式获取不到值...,需要使用get方法 * channelName: //通过类属性方式获取不到值,需要使用get方法 * partnerName2:合作商名称 * channelName2...* channelName3:渠道商名称 //对象自身属性值可以获取 * partnerName4:合作商名称 * channelName4:渠道商名称...* MAX=100 静态属性通过.属性方式获取,对象获取使用get方法获取 * @param args */ public static void main(String

    9910

    【Kotlin】函数类型 ( 函数类型 | 带参数名称参数列表 | 可空函数类型 | 复杂函数类型 | 带接收者函数类型 | 函数类型别名 | 函数类型实例化 | 函数调用 )

    函数类型 ---- 函数类型格式 : 圆括号中定义 参数类型列表 , 使用 -> 由参数列表指向返回值类型 , 表示接受 参数类型列表 中参数 , 返回 返回值类型 返回值 ; ( 参数类型列表 )...{ return a + b } // 将顶层 add 函数赋值给 add3 函数类型变量 :: 用于获取顶层定义函数 // 如果获取 中定义函数 , 可以使用 名::函数名 获取...函数类型 派生 : 函数类型可以看做一个接口 , 可以实现该接口 , 在实现中实现具体函数操作 , 该 函数类型接口实现 , 可以赋值给函数类型变量 ; class AddOperation...函数类型变量调用 ---- 函数类型变量调用 : ① invoke 调用 : 可以通过 函数类型变量名.invoke(参数列表) 调用函数 ; ② 直接调用 : 也可以通过 函数类型变量名(参数列表)...直接调用函数 , 将该变量名称当做函数名称来使用 ;

    2.7K10
    领券