【问题标题】:Adding Android JUnit tests with a custom InstrumentationTestRunner使用自定义 InstrumentationTestRunner 添加 Android JUnit 测试
【发布时间】:2013-02-27 02:23:43
【问题描述】:

我想添加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: 在 ComponentInfo{codeguru.example.testrunner.tests/codeguru.example.testrunner.ExampleTestRunner} 的 onCreate() 中抛出异常: java.lang.NullPointerException
E/AndroidRuntime(880): 在 android.app.ActivityThread.handleBindApplication(ActivityThread.java:4145)
E/AndroidRuntime(880): 在 android.app.ActivityThread.access$1300(ActivityThread.java:130)
E/AndroidRuntime(880): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1255)
E/AndroidRuntime(880): 在 android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(880):在 android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(880): 在 android.app.ActivityThread.main(ActivityThread.java:4745)
E/AndroidRuntime(880): 在 java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(880):在 java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(880):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
E/AndroidRuntime(880):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/AndroidRuntime(880):在 dalvik.system.NativeStart.main(本机方法)
E/AndroidRuntime(880): 引起: java.lang.NullPointerException
E/AndroidRuntime(880):在 codeguru.example.testrunner.ExampleTestRunner.getAllTests(ExampleTestRunner.java:22)
E/AndroidRuntime(880):在 android.test.InstrumentationTestRunner.getTestSuite(InstrumentationTestRunner.java:581)
E/AndroidRuntime(880):在 android.test.InstrumentationTestRunner.onCreate(InstrumentationTestRunner.java:360)
E/AndroidRuntime(880): 在 android.app.ActivityThread.handleBindApplication(ActivityThread.java:4142)
E/AndroidRuntime(880): ... 10 更多

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

【问题讨论】:

  • 我尝试了同样的方法,已覆盖 getAllTests(),但是当我使用自定义运行器从 Eclipse 运行它时,在一个空的测试类上,它只显示该测试类,而不是从跑步者??关于如何进行这项工作的任何见解或想法?可能它只能从命令行工作?
  • 当使用命令行和 adb 运行命令时,就像您展示的那样,它确实可以正常工作!还发现它在eclipse中可以正常工作,如果您在run configurationrun all tests中选择而不是选择单个测试。
  • @Peterdk 如果您仍需要帮助,我建议您发布自己的问题并附上此问题的链接。请务必解释为什么您的问题与我在这里询问的不同。

标签: android testing junit automated-tests


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多