title: junit TestWatcher failed and finished methods firing time
body: <p>I am writing some functional tests with webdriver and executing them with JUnit. I am trying to make use of TestWatcher class so everytime an event occurs a specific action could be done. I am overriding the finished and failed methods, but it seems to be that these are fired virtually simultaneously, so the driver has been already disposed by finish method before the failed method could do it's stuff. </p>
  
  <p>The TestWatcher is following:</p>
  
  <pre><code>public class TestRules extends TestWatcher {
  
  private static WebDriver driver;
  private static final Logger Log = LogManager.getLogger(TestRules.class);
  
  public TestRules() {
      if (driver == null)
          try {
              driver = TestHelpers.getWebDriver();
          } catch (Exception e) {
              throw new RuntimeException(e);
          }
  }
  
  @Override
  protected void starting(Description description){
      Log.info(String.format("Started test: %s::%s", description.getClassName(), description.getMethodName()));
      try {
          new LoginTest().testDoLogin();
      } catch (Exception e) {
          Log.error(e);
      }
  }
  
  @Override
  protected void failed(Throwable e, Description description) {
      File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
  
      String path = String.format("C:\\localdev\\screenshot\\%d__%s_%s.png",
              Calendar.getInstance().getTimeInMillis(), description.getClassName(), description.getMethodName());
      try {
          FileUtils.copyFile(scrFile, new File(path));
      } catch (IOException ioe) {
          Log.error(ioe);
      }
      Log.error(String.format("Error: %s\nScreenshot: %s", e.getMessage(), path));
  }
  
  @Override
  protected void finished(Description description) {
      Log.info(String.format("Finished test: %s::%s", description.getClassName(), description.getMethodName()));
      try {
          // This actually calling driver.quit() &lt;- (driver == WebDriver)
          TestHelpers.close();
      } catch (Exception e) {
          Log.error(e);
      }
  }
  
  }
  </code></pre>
  
  <p>The test could be something like this:</p>
  
  <pre><code>public class testSomething {
  private static final Logger Log = LogManager.getLogger(testSomething.class);
  
  @Rule
  public TestRules testRules = new TestRules();
  
  @Test
  public void filterTableByNameWildcard() throws Exception {
      Log.info("Starting the test filterTable");
  
      MainView mainView = getMainView();
      String searchString = "A*";
      mainView.setFilterParametersAndDoFilter(searchString, "", true, true);
      mainView.validateWildCardSearchReturnsCorrectData(searchString);
      // Random failing point for testing
      Assert.assertTrue(false);
  </code></pre>
  
  <p>When i run my test, i am getting a following error:</p>
  
  <pre><code>java.lang.AssertionError: 
  Expected :true
  Actual   :false
   &lt;Click to see difference&gt;
      at org.junit.Assert.fail(Assert.java:88)
      at org.junit.Assert.failNotEquals(Assert.java:789)
      at org.junit.Assert.assertEquals(Assert.java:118)
      at org.junit.Assert.assertEquals(Assert.java:144)
      at xxx.Tests.xxx.testSomething.filterSomething(TestSomething.java:34)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      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.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
      at org.junit.rules.RunRules.evaluate(RunRules.java:20)
  .... skipped
  
  
  org.openqa.selenium.remote.SessionNotFoundException: The FirefoxDriver cannot be used after quit() was called.
  Build info: version: '2.33.0', revision: '4e90c97', time: '2013-05-22 15:33:32'
  System info: os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.7.0_21'
  Driver info: driver.version: FirefoxDriver
      at org.openqa.selenium.firefox.FirefoxDriver$LazyCommandExecutor.execute(FirefoxDriver.java:352)
      at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:527)
      at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:569)
      at org.openqa.selenium.firefox.FirefoxDriver.getScreenshotAs(FirefoxDriver.java:316)
      at xxx.TestHelpers.TestRules.failed(TestRules.java:47)
      at org.junit.rules.TestWatcher.failedQuietly(TestWatcher.java:84)
      at org.junit.rules.TestWatcher.access$300(TestWatcher.java:46)
      at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:62)
      at org.junit.rules.RunRules.evaluate(RunRules.java:20)
  </code></pre>
  
  <p>Any ideas how to get pass it?</p>
  
  <p>EDIT:
  From documentation:</p>
  
  <p>protected void  finished(Description description)
  Invoked when a test method finishes (whether passing or failing)</p>
  
  <p>protected void  failed(Throwable e, Description description)
  Invoked when a test fails</p>
  
  <p>It would make sense, that firstly the "failed" is called and after that, the "finished" is called, but it seems to be the other way around.  </p>