1

the method process is really throwing the exception however when I test this in junit is not working eventhough I placed next to the @Test annotation the expected exception to be thrown the test fails why is this happening?

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");
}
Rubenex
  • 469
  • 2
  • 8
  • 23

2 Answers2

0

You need to specify the Runner for your test class as:

@RunWith(JUnit4.class)

Plus your test function probably should not start with a capital letter (CalculatorTestDivisionByZero).

Gergely Bacso
  • 14,243
  • 2
  • 44
  • 64
0

The following works for me (i.e. the test passes):

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

I don't need lowercase methods or @RunWith.

Maybe your calculator is starting a different thread or process? Then the Exception wouldn't be thrown in the test Thread. You could also check whether you are importing the correct ArithmeticException class, there may be other ones provided by your application.

TilmannZ
  • 1,784
  • 11
  • 18
  • I think you are right the exception is not thrown in the test thread because I am creating an object in the test but how do I catch the exception then? – Rubenex Aug 19 '15 at 14:55
  • You can either use this: http://stackoverflow.com/questions/6546193/how-to-catch-an-exception-from-a-thread, or you can surround your run() method with a try-catch(Throwable) block. You can then store any exception that you get in the block somewhere else, for example in a `public static ConcurrentLinkedQueue exceptions` in your test class. In the test you then assert that your exception queue is empty. – TilmannZ Aug 19 '15 at 15:05