使用自定义InstrumentationTestRunner添加Android JUnit测试

时间:2013-02-27 02:23:44

标签: android testing junit automated-tests

我想添加parameterized tests to my Android app test suite。在回答我之前的问题时,@ dtmilano建议我实现一个测试运行器,它可以将参数传递给我的参数化测试。我想直接将这些传递给测试的构造函数,而不是retrieving them via getter methods。举个简单的例子,我扩展了InstrumentationTestRunner:

public class ExampleTestRunner extends InstrumentationTestRunner {

    @Override
    public TestSuite getAllTests() {
        TestSuite suite = super.getAllTests();
        suite.addTest(new TestRunnerActivityTest()); // line 22
        return suite;
    }
}

我还更新了测试项目的清单:

<instrumentation android:name="codeguru.example.testrunner.ExampleTestRunner"
                 android:targetPackage="codeguru.example.testrunner"
                 android:label="Tests for codeguru.example.testrunner"/>

当我用

运行此测试时
$ adb shell am instrument -w codeguru.example.testrunner.tests/codeguru.example.testrunner.ExampleTestRunner    

我得到了

E/AndroidRuntime(  880): java.lang.RuntimeException: Exception thrown in onCreate() of ComponentInfo{codeguru.example.testrunner.tests/codeguru.example.testrunner.ExampleTestRunner}: java.lang.NullPointerException
E/AndroidRuntime(  880):        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4145)
E/AndroidRuntime(  880):        at android.app.ActivityThread.access$1300(ActivityThread.java:130)
E/AndroidRuntime(  880):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1255)
E/AndroidRuntime(  880):        at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  880):        at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(  880):        at android.app.ActivityThread.main(ActivityThread.java:4745)
E/AndroidRuntime(  880):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(  880):        at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(  880):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
E/AndroidRuntime(  880):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/AndroidRuntime(  880):        at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(  880): Caused by: java.lang.NullPointerException
E/AndroidRuntime(  880):        at codeguru.example.testrunner.ExampleTestRunner.getAllTests(ExampleTestRunner.java:22)
E/AndroidRuntime(  880):        at android.test.InstrumentationTestRunner.getTestSuite(InstrumentationTestRunner.java:581)
E/AndroidRuntime(  880):        at android.test.InstrumentationTestRunner.onCreate(InstrumentationTestRunner.java:360)
E/AndroidRuntime(  880):        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4142)
E/AndroidRuntime(  880):        ... 10 more

显然,我得到了一个N​​PE,因为super.getAllTests()返回null。我当然可以创建一个new TestSuite()并添加我的测试。理想情况下,我想将参数化测试添加到我已经拥有的其他“正常”测试中。有谁知道我可以做到这一点的方式?

1 个答案:

答案 0 :(得分:1)

对我有用的解决方案,虽然不完全令人满意,但是要用super.getAllTests()替换new TestSuite()的来电。