您好我需要为Android项目编写Junit测试,但它有JNI方法,因为它使用webkit。我有任何方法可以测试这些Android方法(我不想测试JNI方法)。
就像:
public void androidMethod(){
//some android code
nativeInit(); //how do I mock such methods?
//some code again
}
我尝试过powermock,easymock,roboelectric但是没有成功。请帮助我。
答案 0 :(得分:0)
我昨天发现我可以用Mockito解决这个问题(我没有尝试过powermock或easymock)。假设你的班级是C班,我的解决方案是:
C c=spy(new C);
doNothing().when(c).nativeInit();
c.androidMethod()
verify(c).nativeInit();
当然,这确实要求nativeInit对测试可见。
答案 1 :(得分:0)
尽管我已经在src/test
下的JUnit测试中使用过模仿,但我遇到了同样的问题事件。在src/androidTest
下添加测试后,我开始遇到问题,包括此崩溃:
Mockito无法模拟/间谍,因为:
-期末班
在手动创建类open
之后,在JNI层尝试加载*.so
库时,我仍然遇到崩溃(如果模拟正常运行,则不会发生)。 / p>
相反,我要做的是使用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")
}
}
}
结果是一种灵活的方法,可以将类标记为已打开,而无需在发布版本中实际将其打开。当然,这是因为我们在 版本中创建的@OpenForTesting
注释没有用@OpenClass
标记 ,但在 < em> debug用@OpenClass
标记 。在build.gradle
中,我们将该注释指定为kotlin-allopen
插件的信号。因此,所有带有@OpenForTesting
注释的类都将在编译时打开,但只能在Debug构建中打开。