1b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpackage org.junit.rules; 2b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 3b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.internal.AssumptionViolatedException; 4b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runner.Description; 5b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runners.model.Statement; 6b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 7b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot/** 8b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * TestWatcher is a base class for Rules that take note of the testing 9b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * action, without modifying it. For example, this class will keep a log of each 10b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * passing and failing test: 11b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 12b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * <pre> 13b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * public static class WatchmanTest { 14b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * private static String watchedLog; 15b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 16b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * @Rule 17b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * public MethodRule watchman= new TestWatcher() { 18b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * @Override 19b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * protected void failed(Description d) { 20b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * watchedLog+= d + "\n"; 21b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * } 22b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 23b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * @Override 24b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * protected void succeeded(Description d) { 25b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * watchedLog+= d + " " + "success!\n"; 26b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * } 27b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * }; 28b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 29b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * @Test 30b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * public void fails() { 31b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * fail(); 32b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * } 33b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 34b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * @Test 35b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * public void succeeds() { 36b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * } 37b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * } 38b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * </pre> 39b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot */ 40b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpublic abstract class TestWatcher implements TestRule { 41b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot public Statement apply(final Statement base, final Description description) { 42b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot return new Statement() { 43b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot @Override 44b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot public void evaluate() throws Throwable { 45b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot starting(description); 46b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot try { 47b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot base.evaluate(); 48b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot succeeded(description); 49b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } catch (AssumptionViolatedException e) { 50b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot throw e; 51b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } catch (Throwable t) { 52b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot failed(t, description); 53b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot throw t; 54b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } finally { 55b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot finished(description); 56b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 57b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 58b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot }; 59b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 60b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 61b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot /** 62b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * Invoked when a test succeeds 63b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 64b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * @param description 65b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot */ 66b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot protected void succeeded(Description description) { 67b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 68b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 69b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot /** 70b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * Invoked when a test fails 71b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 72b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * @param e 73b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * @param description 74b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot */ 75b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot protected void failed(Throwable e, Description description) { 76b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 77b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 78b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot /** 79b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * Invoked when a test is about to start 80b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 81b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * @param description 82b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot */ 83b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot protected void starting(Description description) { 84b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 85b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 86b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 87b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot /** 88b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * Invoked when a test method finishes (whether passing or failing) 89b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 90b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * @param description 91b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot */ 92b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot protected void finished(Description description) { 93b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 94b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot} 95