android.kotlin,lateinit-var成员的覆盖率测试失败



在android kotlin类中,它有一个lateinit var成员。引用它的函数的覆盖率测试失败。

这里的简化类:

open class TestC constructor(context: Context) {
private lateinit var mModule: NotificationModule
protected fun setModule(module: NotificationModule) {
mModule = module
}
protected fun getModule(): NotificationModule {
return mModule
}
fun doSomething() {
if (mModule.pushToken == null) {
System.out.println(("+++ 111"))
} else {
System.out.println(("+++ 222"))
}
}
@JvmField
protected var mContext: Context
init {
mContext = context
}
}
class NotificationModule {
private var _token: String? = null
val pushToken: String?
get() = _token
protected open fun setPushToken(pushToken: String) {
_token = pushToken
}
}

getModule()doSomething()上的覆盖测试失败。

反编译的代码显示它将在非null成员上检查null,以便覆盖率测试报告分支丢失:

@NotNull
protected final NotificationModule getModule() {
NotificationModule var10000 = this.mModule;
if (var10000 == null) {  //<== never null
Intrinsics.throwUninitializedPropertyAccessException("mModule");
}
return var10000;
}
public final void doSomething() {
NotificationModule var10000 = this.mModule;
if (var10000 == null) { //<== never null
Intrinsics.throwUninitializedPropertyAccessException("mModule");
}
if (var10000.getPushToken() == null) {
System.out.println("+++ 111");
} else {
System.out.println("+++ 222");
}
}

如何测试那些隐藏的代码分支?

更新:

这是测试错过了一个应该在初始化之前测试访问字段的情况

结束这个问题。

oh删除lateinit

private var mModule: NotificationModule? = null
protected fun getModule(): NotificationModule {
return mModule?: throw UninitializedPropertyAccessException("!!! mModule has not been initialized") //mimic lateinit behavior

}

最新更新