有没有办法使用junit.extensions.TestSetup在Android测试的方法吗?(I

2019-09-17 10:04发布

在Android SDK源包括源junit.extensions,但这些类不在的android.jar即使junit.framework和junit.runner都在那里。 我试图创造我自己的junit.extensions包,并使用包含在Android SDK源的来源,但我得到一个ClassCastException(见下文)。 东西android.test.suitebuilder试图从suite()方法将返回值转换为TestCase,即使套房返回测试界面。

我想用从junit.extensions TestSetup类,如下面的例子(见http://etutorials.org/Programming/Java+extreme+programming/Chapter+4.+JUnit/4.7+One-Time+Set+Up +和+撕裂+向下/ ):

public SomeTestCase extends TestCase {

  public static Test suite() {
    TestSetup setup = new TestSetup(new TestSuite(SomeTestCase.class)) {
      @Override
      protected void setUp(  ) throws Exception {
          // do your one-time setup here!
      }

      @Override
      protected void tearDown(  ) throws Exception {
          // do your one-time tear down here!
      }
    };
    return setup;
  }

  public void someTestMethod() { }

}

不过,我得到以下错误:

05-21 08:10:14.152: I/TestRunner(1316): java.lang.RuntimeException: Exception during suite construction
05-21 08:10:14.152: I/TestRunner(1316):     at android.test.suitebuilder.TestSuiteBuilder$FailedToCreateTests.testSuiteConstructionFailed(TestSuiteBuilder.java:238)
05-21 08:10:14.152: I/TestRunner(1316):     at java.lang.reflect.Method.invokeNative(Native Method)
05-21 08:10:14.152: I/TestRunner(1316):     at java.lang.reflect.Method.invoke(Method.java:511)
05-21 08:10:14.152: I/TestRunner(1316):     at junit.framework.TestCase.runTest(TestCase.java:154)
05-21 08:10:14.152: I/TestRunner(1316):     at junit.framework.TestCase.runBare(TestCase.java:127)
05-21 08:10:14.152: I/TestRunner(1316):     at junit.framework.TestResult$1.protect(TestResult.java:106)
05-21 08:10:14.152: I/TestRunner(1316):     at junit.framework.TestResult.runProtected(TestResult.java:124)
05-21 08:10:14.152: I/TestRunner(1316):     at junit.framework.TestResult.run(TestResult.java:109)
05-21 08:10:14.152: I/TestRunner(1316):     at junit.framework.TestCase.run(TestCase.java:118)
05-21 08:10:14.152: I/TestRunner(1316):     at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
05-21 08:10:14.152: I/TestRunner(1316):     at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
05-21 08:10:14.152: I/TestRunner(1316):     at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:545)
05-21 08:10:14.152: I/TestRunner(1316):     at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551)
05-21 08:10:14.152: I/TestRunner(1316): Caused by: java.lang.ClassCastException: com.somebody.test.SomeTestCase$1 cannot be cast to junit.framework.TestCase
05-21 08:10:14.152: I/TestRunner(1316):     at android.test.suitebuilder.TestSuiteBuilder.build(TestSuiteBuilder.java:188)
05-21 08:10:14.152: I/TestRunner(1316):     at android.test.InstrumentationTestRunner.onCreate(InstrumentationTestRunner.java:379)
05-21 08:10:14.152: I/TestRunner(1316):     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3920)
05-21 08:10:14.152: I/TestRunner(1316):     at android.app.ActivityThread.access$1300(ActivityThread.java:123)
05-21 08:10:14.152: I/TestRunner(1316):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1185)
05-21 08:10:14.152: I/TestRunner(1316):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-21 08:10:14.152: I/TestRunner(1316):     at android.os.Looper.loop(Looper.java:137)
05-21 08:10:14.152: I/TestRunner(1316):     at android.app.ActivityThread.main(ActivityThread.java:4424)
05-21 08:10:14.152: I/TestRunner(1316):     at java.lang.reflect.Method.invokeNative(Native Method)
05-21 08:10:14.152: I/TestRunner(1316):     at java.lang.reflect.Method.invoke(Method.java:511)
05-21 08:10:14.152: I/TestRunner(1316):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-21 08:10:14.152: I/TestRunner(1316):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-21 08:10:14.152: I/TestRunner(1316):     at dalvik.system.NativeStart.main(Native Method)

一个TestCase的suite()方法应该返回一个测试,但它似乎在一些Android操作系统正试图将其转换为一个TestCase。

作为一个试图解决这个问题,我调整了TestDecorator类,以便它的子类,而不是测试TestCase的,但它仍然给了相同的ClassCastException异常,这确实迷惑了我。

顺便说一句,似乎有大约含有的JUnit的android.jar有些怀疑,所以这里的内容的android.jar的部分列表:

$ jar tf android.jar | more
META-INF/
META-INF/MANIFEST.MF
assets/
assets/images/
assets/images/android-logo-mask.png
assets/images/android-logo-shine.png
assets/sounds/
assets/sounds/bootanim1.raw
assets/sounds/bootanim0.raw
assets/webkit/
assets/webkit/android-weberror.png
assets/webkit/togglePlugin.png
assets/webkit/nullPlugin.png
assets/webkit/youtube.html
assets/webkit/missingImage.png
assets/webkit/youtube.png
assets/webkit/textAreaResizeCorner.png
assets/webkit/play.png
junit/
junit/framework/
junit/framework/TestSuite.class
junit/framework/ComparisonFailure.class
junit/framework/Assert.class
junit/framework/TestListener.class
junit/framework/TestResult.class
junit/framework/Test.class
junit/framework/TestFailure.class
junit/framework/Protectable.class
junit/framework/TestCase.class
junit/framework/AssertionFailedError.class
junit/runner/
junit/runner/TestSuiteLoader.class
junit/runner/Version.class
junit/runner/BaseTestRunner.class

您还可以看到它在Android的参考网站上的内容包装上市https://developer.android.com/reference/packages.html 。 如果继续怀疑,请浏览你的android.jar的副本。

任何有益的建议? 有没有人成功地使用junit.extensions.TestSetup与Android?

文章来源: Is there a way to use junit.extensions.TestSetup for tests on Android?
标签: android junit