Kotlin和Mockito-对超类的模拟函数调用

时间:2018-10-09 02:17:30

标签: kotlin mockito

我在使用Mockito时遇到一些问题,并在Kotlin中取消使用类作为参数的方法。

我有一些定义如下的类:

open interface interfaceFile {
  fun someFun(param1: String): String
} 

abstact class abstractClass {
  abstract val variable1: RandomType

  open fun<T> getObject(param1: String, param2: Class<T>, vararg param3: Any): T? {
    doSomeStuff()
}

open class concreteClass @Autowired constructor(
    override val variable1: RandomType
  ): abstractClass(), interfaceFile {

    override fun someFun(param1: String): String {
      return getObject(param1, string::Class.java)!!

}

然后,我尝试使用Mockito模拟getObject函数并按如下所示对其进行测试:

fun setUp() {
  MockitoAnnotations.initMock(this)
  testObject = mock(concreteClass::class.java)
}

fun testSomeFun() {
  `when`(testObject!!.getObject("string1", String::class.java)).thenReturn("Mocked")
  val actualResponse = testObject!!.someFun("string1")
  assertEquals("message", "Mocked", actualResponse)
}

简而言之,concreteClass.someFun将呼叫abstractClass.getObject,后者将呼叫doSomeStuff。但是在测试期间,我想存根abstractClass.getObject以便返回。但是当前的行为似乎是我总是得到null

我已经简化了它,使其只需要一个字符串参数,并将其存根即可使用,但是当我将类类型作为参数引入时,它似乎停止工作。

围绕它搜索似乎是我的问题与我的when调用中的不正确的参数匹配有关,但是由于我什至输入了精确的值而不是使用ArgumentMatchers,所以我无法弄清楚它出了什么问题。任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

您的someFun方法来自接口,因此我们也可以说它也是open。这就是为什么在模拟中它会返回null来覆盖。要使其成为基本代码,请编写以下代码:

`when`(testObject!!.someFun("string1")).thenCallRealMethod()

顺便说一句。为什么您的testObject可为空?将其设置为lateinit var testObject: concreteClass,以在setUp函数中对其进行初始化。