junit 在Kotlin模仿一个全球性的财产

s4n0splo  于 2022-11-11  发布在  Kotlin
关注(0)|答案(1)|浏览(118)

我正面临着与下面问题相同的问题。请帮助我解决。
Mock a "global" property in Kotlin
我尝试了上述问题中提供的解决方案,但没有任何工作。我问同样的问题,因为我不能发表任何评论上一个问题。
我正在为下面的课程编写测试用例

class CustomLogger constructor(val ctx: Context, embEnabled: Boolean = false) : Logger {

private val loggers = arrayListOf<Logger>()
fun get() = loggers

init {
    if (embEnabled)
        loggers.add(Emb(ctx))
    if (BuildConfig.DEBUG)
        loggers.add(DebugLogger(ctx))
}

override fun logError(t: Throwable, msg: String?) {
    loggers.forEach { logger ->
        logger.logError(t, msg)
    }
 }
}
enter code here

这里我尝试模拟get()或init{}

3okqufwl

3okqufwl1#

这是一个该死问题,但我注意到这只能在单元测试中使用,因为Android JVM不支持mockito静态模拟

testImplementation "org.mockito:mockito-inline:4.8.1" you gonna need 

this so added 
   Update you need to call this i forgot to add it sorry in your test case before call the method
Mockito.mockStatic(Class.forName("com.udacity.project4.locationreminders.RemindersActivityKt"))

fun getMockForMethod(clazz: Class<*>, methodName: String, methodResponse: Any) {
    val method: Method = clazz.getMethod(methodName)
    Mockito.`when`(method.invoke(null)).thenReturn(methodResponse)
}

现在我创建了处理无参数方法的方法,您可以根据需要修改它,只需使用它的名称传递类

getMockForMethod(Class.forName("com.udacity.project4.locationreminders.RemindersActivityKt"),
    "doSomething","New Response")
    Assert.assertEquals("New Response", doSomething())

工作起来就像一个魅力享受😁
我已经更新了上面的代码,任何人都可以在Kotlin中使用静态成员
你的更新使得这很容易做到,现在它是一个类,你可以完全模拟和容易地模拟任何方法

val loggerMock= Mockito.mock(Logger::class.java)
    Mockito.`when`(loggerMock.loggers).thenReturn(new array of loggers)

相关问题