title: Testing Exceptions using Java Reflection Junit4
body: <p>I have a function which returns an exception and i am writing a unit test case for it in Junit4. The issue is, reflect.invoke always wraps the exception in InvocationTargetException and hence unable to check the exception using ExpectedException class.</p>
  
  <pre><code>public class Hello {
  private void printHello(String msg) {
      if ("hello".equals(msg)) {
          System.out.println("Hello");
      }
          else throw new HeaderException();
      }
  }
  </code></pre>
  
  <p>Test:</p>
  
  <pre><code>@Rule
  public ExpectedException expectedEx = ExpectedException.none();
  @Test
  public void testPrint() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
      expectedEx.expect(HeaderException.class);
  
      Method method = Hello.class.getDeclaredMethod("printHello", String.class);
      method.setAccessible(true);
      method.invoke(Hello.class,"random");
  
  }
  </code></pre>
  
  <p>Output:</p>
  
  <pre><code>    java.lang.AssertionError: 
  Expected: an instance of com.locationguru.CSF.exception.HeaderException
       got: &lt;java.lang.reflect.InvocationTargetException&gt;
   &lt;Click to see difference&gt;
  
      at org.junit.Assert.assertThat(Assert.java:780)
      at org.junit.Assert.assertThat(Assert.java:738)
      at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:114)
      at org.junit.rules.RunRules.evaluate(RunRules.java:18)
      at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
      at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
      at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
      at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
      at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
      at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
      at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
      at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
      at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
      at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
      at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
      at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
      at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
  </code></pre>