title: TestWatcher does not catch failed tests when run with JUnitCore
body: <p>If I right click on and run this rest from my IDE, the test classs <code>SimpleJunit</code> will fail with this output</p>
  
  <pre><code>2018-05-08 09:13:38.297-0700 D SimpleJunit starting()
  2018-05-08 09:13:38.301-0700 D SimpleJunit before()
  2018-05-08 09:13:38.302-0700 D SimpleJunit after()
  
  junit.framework.AssertionFailedError
      at junit.framework.Assert.fail(Assert.java:55)
      at junit.framework.Assert.fail(Assert.java:64)
      at junit.framework.TestCase.fail(TestCase.java:235)
      at srcNew.SimpleJunit.before(SimpleJunit.java:18)
      at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.base/java.lang.reflect.Method.invoke(Method.java:564)
      at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
      at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
      at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
      at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
      at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
      at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
      at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
      at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
      at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
      at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
      at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
      at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
      at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
      at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
      at org.junit.rules.RunRules.evaluate(RunRules.java:20)
      at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
      at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
      at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
      at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
      at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
      at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
  
  
  junit.framework.AssertionFailedError
      at junit.framework.Assert.fail(Assert.java:55)
      at junit.framework.Assert.fail(Assert.java:64)
      at junit.framework.TestCase.fail(TestCase.java:235)
      at srcNew.SimpleJunit.after(SimpleJunit.java:32)
      at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.base/java.lang.reflect.Method.invoke(Method.java:564)
      at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
      at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
      at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
      at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:33)
      at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
      at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
      at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
      at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
      at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
      at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
      at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
      at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
      at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
      at org.junit.rules.RunRules.evaluate(RunRules.java:20)
      at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
      at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
      at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
      at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
      at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
      at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
  
  
  2018-05-08 09:13:38.314-0700 D SimpleJunit succeeded()
  2018-05-08 09:13:38.315-0700 D SimpleJunit finished()
  </code></pre>
  
  <p>Here is <code>SimpleJunit</code></p>
  
  <pre><code>public class SimpleJunit {
  
      private static String TAG = SimpleJunit.class.getSimpleName();
  
      @Before
      public void before(){
          Log.d(TAG,"before()");
          fail();
          throw new RuntimeException();
      }
  
      @Test
      public void test(){
          Log.d(TAG,"test()");
          fail();
          throw new RuntimeException();
      }
  
      @After
      public void after(){
          Log.d(TAG,"after()");
          fail();
          throw new RuntimeException();
      }
  
      @ClassRule
      public static TestRule classWatchman = new TestWatcher()
      {
          @Override
          protected void starting(Description d)
          {
              Log.d(TAG,"starting()");
          }
  
          @Override
          protected void failed(Throwable e, Description d)
          {
              Log.d(TAG,"failed()");
          }
  
          @Override
          protected void succeeded(Description d)
          {
              Log.d(TAG,"succeeded()");
          }
  
          @Override
          protected void finished(Description description)
          {
              Log.d(TAG,"finished()");
          }
  
          @Override
          protected void skipped(AssumptionViolatedException e,
                                 Description description)
          {
              Log.d(TAG,"skipped()");
          }
      };
  
  }
  </code></pre>
  
  <p>If I run <code>SimpleJunit</code> from the another class <code>SimpleJunitRunner</code>, the test passes with this output, even though the test should clearly fail.</p>
  
  <pre><code>public class SimpleJunitRunner {
  
      private static String TAG = SimpleJunitRunner.class.getSimpleName();
  
      public static void main(String[] ars){
          Result result = JUnitCore.runClasses(SimpleJunit.class);
          for (Failure failure : result.getFailures()) {
              System.out.println(failure.toString());
          }
      }
  }
  </code></pre>
  
  <p>The output</p>
  
  <pre><code>2018-05-08 09:17:34.089-0700 D SimpleJunit starting()
  2018-05-08 09:17:34.092-0700 D SimpleJunit before()
  2018-05-08 09:17:34.094-0700 D SimpleJunit after()
  test(srcNew.SimpleJunit): null
  test(srcNew.SimpleJunit): null
  2018-05-08 09:17:34.099-0700 D SimpleJunit succeeded()
  2018-05-08 09:17:34.100-0700 D SimpleJunit finished()
  
  Process finished with exit code 0
  </code></pre>
  
  <p>Not sure if I'm using the API wrong, or what's going on here. </p>