在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
}