1b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpackage org.junit.rules; 2b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 3b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runner.Description; 4b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runners.model.Statement; 5b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 6b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot/** 7b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * A base class for Rules (like TemporaryFolder) that set up an external 8b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * resource before a test (a file, socket, server, database connection, etc.), 9b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * and guarantee to tear it down afterward: 10b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 11b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * <pre> 12b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * public static class UsesExternalResource { 13b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * Server myServer= new Server(); 14b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 15b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * @Rule 16b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * public ExternalResource resource= new ExternalResource() { 17b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * @Override 18b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * protected void before() throws Throwable { 19b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * myServer.connect(); 20b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * }; 21b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 22b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * @Override 23b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * protected void after() { 24b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * myServer.disconnect(); 25b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * }; 26b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * }; 27b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 28b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * @Test 29b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * public void testFoo() { 30b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * new Client().run(myServer); 31b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * } 32b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * } 33b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * </pre> 34b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot */ 35b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpublic abstract class ExternalResource implements TestRule { 36b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot public Statement apply(Statement base, Description description) { 37b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot return statement(base); 38b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 39b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 40b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot private Statement statement(final Statement base) { 41b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot return new Statement() { 42b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot @Override 43b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot public void evaluate() throws Throwable { 44b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot before(); 45b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot try { 46b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot base.evaluate(); 47b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } finally { 48b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot after(); 49b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 50b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 51b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot }; 52b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 53b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 54b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot /** 55b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * Override to set up your specific external resource. 56b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * @throws if setup fails (which will disable {@code after} 57b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot */ 58b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot protected void before() throws Throwable { 59b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot // do nothing 60b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 61b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot 62b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot /** 63b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * Override to tear down your specific external resource. 64b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot */ 65b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot protected void after() { 66b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot // do nothing 67b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot } 68b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot} 69