TestWatcher.java revision b3823db9f1192d8c81345740b3e65bd6738ba55b
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 * 	&#064;Rule
17b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	public MethodRule watchman= new TestWatcher() {
18b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		&#064;Override
19b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		protected void failed(Description d) {
20b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 			watchedLog+= d + &quot;\n&quot;;
21b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		}
22b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
23b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		&#064;Override
24b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		protected void succeeded(Description d) {
25b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 			watchedLog+= d + &quot; &quot; + &quot;success!\n&quot;;
26b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		}
27b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	};
28b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
29b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	&#064;Test
30b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	public void fails() {
31b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		fail();
32b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	}
33b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
34b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	&#064;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