类似的问题
虽然我已经在 src/test 下的 JUnit 测试中使用了 mockito,但我遇到了同样的问题事件。在src/androidTest 下添加测试后,我开始遇到问题,包括这次崩溃:
Mockito 无法模拟/监视,因为:
- 最后一课
在手动创建 open 类之后,我仍然在 JNI 层中遇到崩溃,因为它试图加载 *.so 库(如果模拟正常工作就不会发生这种情况)。
工作解决方案
相反,我必须打开课程使用Kotlin's all-open plugin进行测试。 this recent medium post 中也很好地解释了该过程,但归结为以下四个简单的更改,这些更改也在 one of the architecture components sample apps 中建模:
1. 将这些添加到 build.gradle:
buildscript {
dependencies {
classpath "org.jetbrains.kotlin:kotlin-allopen:${versions.kotlin}"
}
}
apply plugin: "kotlin-allopen"
allOpen {
// marker for classes that we want to be able to extend in debug builds
annotation 'com.your.package.name.OpenClass'
}
2. 在调试风格中添加corresponding annotations。例如:app/src/debug/java/com/your/package/name/OpenForTesting.kt
package com.your.package.name
@Target(AnnotationTarget.ANNOTATION_CLASS)
annotation class OpenClass
@OpenClass
@Target(AnnotationTarget.CLASS)
annotation class OpenForTesting
3. 在发布风格中添加corresponding annotation。例如:app/src/release/java/com/your/package/name/OpenForTesting.kt
package com.your.package.name
@Target(AnnotationTarget.CLASS)
annotation class OpenForTesting
4.在需要模拟的类中添加@OpenForTesting注解
package com.your.package.name
@OpenForTesting
class JniClassOfVictory {
...
external fun nativeInit()
...
companion object {
init {
System.loadLibrary("victoryeveryday")
}
}
}
结果是一种将类标记为打开的灵活方式,而无需在发布版本中实际打开它们。当然,这是因为我们在release中创建的@OpenForTesting注解没有用@OpenClass标记,但是在debug中同样的注解是用@OpenClass标记。在build.gradle 中,我们将该注释指定为kotlin-allopen 插件的信号。因此,任何带有 @OpenForTesting 注释的类都将在编译时打开,但仅在 Debug 构建时打开。