最快的方法来创build一个模拟活动进行testing

我现在正在unit testing一个库。 在某些类中,我需要在某些静态方法中传递一个活动作为参数。 图书馆本身不包含任何活动。 我需要以某种方式获得一个模拟活动的实例,以在每个单独的方法testing中使用。

我已经阅读了Activity Testing Tutorial和Testing Fundamentals部分。 如果您要testing项目中已经存在的活动,那么大部分所说的内容都是有意义的。 但是我只需要一个模拟的工具就可以在Ui线程中显示对话框并运行简短的任务。

最快,最简单的方法来实现这一点? 我应该在testing项目中创build模拟活动,还为虚拟用户界面提供xml布局资源吗?


UPDATE
由于我没有find任何自动创build模拟活动的方法,我决定自己提供。 我在testing项目里面创build了一个虚拟活动,它通过xml提供了一个虚拟的布局。 然后我编码我的testing扩展ActivityInstrumentationTestCase2

  public class LibraryTest extends ActivityInstrumentationTestCase2<MockActivity> { public LibraryTest(String name) { super(MockActivity.class); } protected void setUp() throws Exception { super.setUp(); } public void testAMethodFromLibrary() { fail("Not yet implemented"); } } 

其中MockActivity是我在这个testing项目中创build的上述模拟活动。 但是,似乎Androidtesting框架在启动活动时遇到了麻烦,并且出现了这个exception:

  java.lang.RuntimeException: Exception during suite construction at android.test.suitebuilder.TestSuiteBuilder$FailedToCreateTests.testSuiteConstructionFailed(TestSuiteBuilder.java:239) at java.lang.reflect.Method.invokeNative(Native Method) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154) at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:520) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447) Caused by: java.lang.NullPointerException: Method name must not be null. at java.lang.ClassCache.findMethodByName(ClassCache.java:297) at java.lang.Class.getMethod(Class.java:985) at android.test.suitebuilder.TestMethod.getAnnotation(TestMethod.java:60) at android.test.suitebuilder.annotation.HasMethodAnnotation.apply(HasMethodAnnotation.java:39) at android.test.suitebuilder.annotation.HasMethodAnnotation.apply(HasMethodAnnotation.java:30) at com.android.internal.util.Predicates$OrPredicate.apply(Predicates.java:106) at android.test.suitebuilder.annotation.HasAnnotation.apply(HasAnnotation.java:42) at android.test.suitebuilder.annotation.HasAnnotation.apply(HasAnnotation.java:31) at com.android.internal.util.Predicates$NotPredicate.apply(Predicates.java:122) at android.test.suitebuilder.TestSuiteBuilder.satisfiesAllPredicates(TestSuiteBuilder.java:254) at android.test.suitebuilder.TestSuiteBuilder.build(TestSuiteBuilder.java:190) at android.test.InstrumentationTestRunner.onCreate(InstrumentationTestRunner.java:373) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4218) at android.app.ActivityThread.access$3000(ActivityThread.java:125) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2071) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:123) at android.app.ActivityThread.main(ActivityThread.java:4627) at java.lang.reflect.Method.invokeNative(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) at dalvik.system.NativeStart.main(Native Method) 

现在我完全迷失在这里。 这怎么可能如此复杂? 我select了正确的方法吗? 我只是想在testing方法中启动一个对话框。 也许框架搞乱了,因为要testing的活动不在目标项目中?

任何帮助在这里将不胜感激。 我没时间了,如果我找不到正确的方法来做到这一点,我不得不使用我的库创build第二个项目,将模拟活动移到那里,并从testing项目中进行testing。 这是很多代码,因为我不得不在一个(现在不是generics的)模拟活动中包含一个方法,只是为了调用我想要testing的每个库方法。

Related of "最快的方法来创build一个模拟活动进行testing"

解决了! 以下是我所做的:

  • 在testing项目中,我在工具选项卡中删除了目标软件包,并再次将其添加到指向模拟活动所在的testing项目基础软件包。
  • 在我的testing项目中添加了目标库作为Android库。 (右键点击testing项目 – >属性 – > Android – >库 – >添加目标库)。
  • 在testing项目清单中添加了模拟活动。
  • 为了解决我在上面发布的exception,只需用下面的代码replacetesting用例构造函数:

      public LibraryTest() { super(MockActivity.class); } 

现在,这工作,我可以成功地启动对话框。 但在我的简短研究中,我偶然发现了Robotium 。 这个图书馆真是太棒了。 开始时我并不需要这样做,但是我发现以自动方式testingGUI非常有用。 现在我在每个setUp调用中重新创build一个全新的活动。