Android单元测试 - Android类的运行时异常

时间:2015-01-26 10:43:38

标签: java android unit-testing robolectric

我正在开发SDK,我正在尝试对其执行UnitTests。 这意味着我的项目大部分是纯Java代码,在某些地方涉及Android代码。 我想在我的SDK上执行UnitTest,我决定使用Roboelectric,Mockito和PowerMock(静态方法模拟)。

除了一个问题,一切正常: 当我的测试调用任何包含Android类的方法时,我的测试崩溃(由于Stub问题)。 我知道我无法测试Activity,Views和更多类,但问题是即使我的函数包含对Log类的使用,我也会得到RuntimeException。

我该如何处理这个问题? 我决定使用纯UnitTest,因为除了Log类之外,我的大部分代码都不包含Android类。通过使用纯java UnitTest,我不需要运行任何设备,因此我可以同时执行多测试任务。

我试图在我的gradle中包含android.jar文件,但它没有用。

我该怎么办? 1.坚持使用纯Java UnitTest:那么如何忽略/导入Log指令。 2.转到Android测试框架:对我的需求最好的是什么?

以下是我的gradle文件中与测试相关的部分:

    robolectric {
    // configure the set of classes for JUnit tests
    include '**/*UnitTest.class'


    // confgure max heap size of the test JVM
    maxHeapSize = '2048m'

    // configure the test JVM arguments
    jvmArgs '-XX:MaxPermSize=512m', '-XX:-UseSplitVerifier'

    // configure whether failing tests should fail the build
    ignoreFailures true

    // use afterTest to listen to the test execution results
    afterTest { descriptor, result ->
        println "Executing test for {$descriptor.name} with result: ${result.resultType}"
    }
}

dependencies {
    androidTestCompile 'org.robolectric:robolectric:2.3'
    androidTestCompile 'junit:junit:4.10'

    androidTestCompile 'org.mockito:mockito-core:1.8.5'
    androidTestCompile 'org.powermock:powermock-mockito-release-full:1.4.9'
    androidTestCompile files('../libs-test/json.jar')
}

这是一个TestCase类的示例:

import android.util.Log;


import junit.framework.TestCase;

import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.junit.Test;
import org.json.JSONObject;

import static org.powermock.api.mockito.PowerMockito.when;


@RunWith(PowerMockRunner.class)
@PrepareForTest(StaticInClass.class)
public class ClassExampleUnitTest extends TestCase{


    @Test
    public void testSimple(){
        Log.d("UnitTest", "test");
        assertTrue(true);
    }


}

1 个答案:

答案 0 :(得分:1)

当您使用PowerMockRunner运行时,您实际上并未通过robolectric运行。通常,当你需要robolectric框架时,你会这样运行:

@RunWith(RobolectricTestRunner.class)