【问题标题】:Cannot Catch arithmetic exception in junit无法在junit中捕获算术异常
【发布时间】:2015-08-19 14:20:53
【问题描述】:

方法过程确实抛出了异常,但是当我在 junit 中测试它时,即使我将其放在 @Test 注释旁边,预期要抛出的异常测试失败,为什么会发生这种情况?

java.lang.ArithmeticException: / by zero
at com.javageek.junit.Calculator.process(Calculator.java:88)
at com.javageek.junit.CalculatorTest.CalculatorTestDivisionByZero(CalculatorTest.java:50)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:19)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)







@Test(expected=ArithmeticException.class)
public void CalculatorTestDivisionByZero(){
    Calculator calculator = new Calculator();
    calculator.process("DivisionByZero.txt");
}

【问题讨论】:

标签: java unit-testing junit automated-tests


【解决方案1】:

您需要将测试类的 Runner 指定为:

@RunWith(JUnit4.class)

另外,您的测试函数可能不应该以大写字母开头 (CalculatorTestDivisionByZero)。

【讨论】:

  • 虽然我没有扩展 testClass
【解决方案2】:

以下对我有用(即测试通过):

@Test(expected=ArithmeticException.class)
public void CalculatorTestDivisionByZero(){
    int i = 23 / 0;
    System.out.println("i=" + i);
}

我不需要小写方法或@RunWith

也许您的计算器正在启动不同的线程或进程?那么在测试线程中就不会抛出异常。 您还可以检查您是否正在导入正确的 ArithmeticException 类,您的应用程序可能还提供了其他类。

【讨论】:

  • 我认为你是对的,测试线程中没有抛出异常,因为我在测试中创建了一个对象,但是我如何捕获异常呢?
  • 你可以使用这个:stackoverflow.com/questions/6546193/…,或者你可以用 try-catch(Throwable) 块包围你的 run() 方法。然后,您可以将在块中遇到的任何异常存储在其他地方,例如在您的测试类中的 public static ConcurrentLinkedQueue<Throwable> exceptions 中。然后在测试中断言您的异常队列为空。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
  • 2010-10-29
  • 1970-01-01
  • 2021-08-07
  • 2021-10-14
相关资源
最近更新 更多