Android的JUnittesting…如何期待一个例外

我试图编写一些testing使用内置的Android Junittesting框架。 我遇到了一个testing问题,我期待抛出一个exception。 在JUnit中,testing方法的注释是:

@Test(expected = ArithmeticException.class)

但是,在android中,这个testing失败并出现ArithmeticException。

我明白,Android实现只是JUnit 3的一个子集,甚至不允许注解@Test(必须是@SmallTest,@MediumTest或@LargeTest,而且这些参数都不允许使用'expected = ..'参数) ,但这似乎是一个相当重要的testing,似乎像androidtesting框架将严重缺乏,如果它没有这个function。

注意:我通过将JUnit jar添加到项目并添加注释到我的testing方法来testing。 这对我来说是有道理的,为什么注释会被完全忽略,因为android框架(runner?)没有查找那个注释,只是忽略它。 基本上我只是在框架内寻找“正确”的方式来做到这一点。

这种testing的标准答案是:

 public void testThatMethodThrowsException() { try { doSomethingThatShouldThrow(); Assert.fail("Should have thrown Arithmetic exception"); } catch(ArithmeticException e) { //success } } 

现在JUnit4可以通过Android SDK(参考android-test-kit )

更新 :现在在d.android.com上正式发布 :

AndroidJUnitRunner是Android的一个新的非捆绑testing运行器,它是Android支持testing库的一部分,可以通过Android支持库下载。 新的跑步者包含了GoogleInstrumentationTestRunner的所有改进,并添加了更多function:

  • JUnit4支持
  • Instrumentation Registry访问Instrumentation,Context和Bundle Arguments
  • testingfilter@SdkSupress和@RequiresDevice
  • testing超时
  • testing的分解
  • RunListener支持挂钩到testing运行生命周期
  • 活动监视机制ActivityLifecycleMonitorRegistry

所以, JUnit4风格的使用预期注释的exceptiontesting :

 @Test(expected= IndexOutOfBoundsException.class) public void empty() { new ArrayList<Object>().get(0); } 

或预期的例外规则:

 @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void shouldTestExceptionMessage() throws IndexOutOfBoundsException { List<Object> list = new ArrayList<Object>(); thrown.expect(IndexOutOfBoundsException.class); thrown.expectMessage("Index: 0, Size: 0"); list.get(0); // execution will never get past this line } 

也是可能的。

有关如何设置testing支持库的更多详细信息,请参阅官方文档 。