如何在 Robolectric 4.3.1 上隐藏 Kotlin 伴随对象?
How to shadow a Kotlin companion object on Robolectric 4.3.1?
我想隐藏一个 Kotlin 伴生对象。我想要隐藏的伴随对象是:
class MyLogClass {
companion object {
@JvmStatic
fun logV(tag: String, messageProvider: () -> String) {
if (SPUtils.getLogLevel() >= mLogLevel) {
Log.v(tag, messageProvider.invoke())
}
}
}
}
我尝试过的:
// Shadow class...
@Implements(MyLogClass.Companion::class)
class ShadowMyLogClass {
@Implementation
fun v(tag: String, messageProvider: () -> String) {
redirectConsole(tag, messageProvider)
}
private fun redirectConsole(tag: String, messageProvider: () -> String) {
println("[$tag]${messageProvider.invoke()}")
}
}
// And in Testing class...
class TestMyLogClass {
@Test
fun test() {
MyLogClass.logV("some tag") {
"some message"
}
}
}
但是我试过发生错误:
Caused by: java.lang.IllegalAccessError: tried to access class kotlin.jvm.internal.DefaultConstructorMarker from class com.example.zspirytus.log.impl.MyLogClass$Companion
似乎丢失了一个类型为DefaultConstructorMarker
的构造方法,我该如何制作DefaultConstructorMarker
或其他方式来创建Shadow MyLogClass
?感谢您的阅读和回答!
这是我在伴随对象中隐藏方法的方法
@Implements(Object::class)
class ShadowObject {
companion object {
@Implementation
@JvmStatic
fun verify(): Boolean {
return true
}
}
}
使用:
@RunWith(AndroidJUnit4::class)
@Config(shadows = [
ShadowObject::class
])
class UserTest {
// Rest of testing class
}
在你的情况下,我会说你只需要用 companion object
包装你的 @Implementation 方法,并将 @Implements(MyLogClass.Companion::class)
更改为 @Implements(MyLogClass::class)
我想隐藏一个 Kotlin 伴生对象。我想要隐藏的伴随对象是:
class MyLogClass {
companion object {
@JvmStatic
fun logV(tag: String, messageProvider: () -> String) {
if (SPUtils.getLogLevel() >= mLogLevel) {
Log.v(tag, messageProvider.invoke())
}
}
}
}
我尝试过的:
// Shadow class...
@Implements(MyLogClass.Companion::class)
class ShadowMyLogClass {
@Implementation
fun v(tag: String, messageProvider: () -> String) {
redirectConsole(tag, messageProvider)
}
private fun redirectConsole(tag: String, messageProvider: () -> String) {
println("[$tag]${messageProvider.invoke()}")
}
}
// And in Testing class...
class TestMyLogClass {
@Test
fun test() {
MyLogClass.logV("some tag") {
"some message"
}
}
}
但是我试过发生错误:
Caused by: java.lang.IllegalAccessError: tried to access class kotlin.jvm.internal.DefaultConstructorMarker from class com.example.zspirytus.log.impl.MyLogClass$Companion
似乎丢失了一个类型为DefaultConstructorMarker
的构造方法,我该如何制作DefaultConstructorMarker
或其他方式来创建Shadow MyLogClass
?感谢您的阅读和回答!
这是我在伴随对象中隐藏方法的方法
@Implements(Object::class)
class ShadowObject {
companion object {
@Implementation
@JvmStatic
fun verify(): Boolean {
return true
}
}
}
使用:
@RunWith(AndroidJUnit4::class)
@Config(shadows = [
ShadowObject::class
])
class UserTest {
// Rest of testing class
}
在你的情况下,我会说你只需要用 companion object
包装你的 @Implementation 方法,并将 @Implements(MyLogClass.Companion::class)
更改为 @Implements(MyLogClass::class)