001 package org.junit.rules;
002
003 import org.junit.runner.Description;
004 import org.junit.runners.model.Statement;
005
006 /**
007 * A base class for Rules (like TemporaryFolder) that set up an external
008 * resource before a test (a file, socket, server, database connection, etc.),
009 * and guarantee to tear it down afterward:
010 *
011 * <pre>
012 * public static class UsesExternalResource {
013 * Server myServer= new Server();
014 *
015 * @Rule
016 * public ExternalResource resource= new ExternalResource() {
017 * @Override
018 * protected void before() throws Throwable {
019 * myServer.connect();
020 * };
021 *
022 * @Override
023 * protected void after() {
024 * myServer.disconnect();
025 * };
026 * };
027 *
028 * @Test
029 * public void testFoo() {
030 * new Client().run(myServer);
031 * }
032 * }
033 * </pre>
034 *
035 * @since 4.7
036 */
037 public abstract class ExternalResource implements TestRule {
038 public Statement apply(Statement base, Description description) {
039 return statement(base);
040 }
041
042 private Statement statement(final Statement base) {
043 return new Statement() {
044 @Override
045 public void evaluate() throws Throwable {
046 before();
047 try {
048 base.evaluate();
049 } finally {
050 after();
051 }
052 }
053 };
054 }
055
056 /**
057 * Override to set up your specific external resource.
058 *
059 * @throws Throwable if setup fails (which will disable {@code after}
060 */
061 protected void before() throws Throwable {
062 // do nothing
063 }
064
065 /**
066 * Override to tear down your specific external resource.
067 */
068 protected void after() {
069 // do nothing
070 }
071 }