有没有办法在我的android项目中模拟JNI方法来进行Junit测试?

时间:2014-03-17 04:48:31

标签: java android unit-testing junit java-native-interface

您好我需要为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但是没有成功。请帮助我。

2 个答案:

答案 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构建中打开。