package org.junit.rules;
import org.junit.runner.
Description;
import org.junit.runners.model.
Statement;
/**
* A base class for Rules (like TemporaryFolder) that set up an external
* resource before a test (a file, socket, server, database connection, etc.),
* and guarantee to tear it down afterward:
*
* <pre>
* public static class UsesExternalResource {
* Server myServer= new Server();
*
* @Rule
* public ExternalResource resource= new ExternalResource() {
* @Override
* protected void before() throws Throwable {
* myServer.connect();
* };
*
* @Override
* protected void after() {
* myServer.disconnect();
* };
* };
*
* @Test
* public void testFoo() {
* new Client().run(myServer);
* }
* }
* </pre>
*
* @since 4.7
*/
public abstract class
ExternalResource implements
TestRule {
public
Statement apply(
Statement base,
Description description) {
return
statement(
base);
}
private
Statement statement(final
Statement base) {
return new
Statement() {
@
Override
public void
evaluate() throws
Throwable {
before();
try {
base.
evaluate();
} finally {
after();
}
}
};
}
/**
* Override to set up your specific external resource.
*
* @throws Throwable if setup fails (which will disable {@code after}
*/
protected void
before() throws
Throwable {
// do nothing
}
/**
* Override to tear down your specific external resource.
*/
protected void
after() {
// do nothing
}
}