如何在 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)