我在使用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,所以我无法弄清楚它出了什么问题。任何建议将不胜感激。
答案 0 :(得分:0)
您的someFun
方法来自接口,因此我们也可以说它也是open
。这就是为什么在模拟中它会返回null来覆盖。要使其成为基本代码,请编写以下代码:
`when`(testObject!!.someFun("string1")).thenCallRealMethod()
顺便说一句。为什么您的testObject
可为空?将其设置为lateinit var testObject: concreteClass
,以在setUp
函数中对其进行初始化。