package org.junit; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Annotates static fields that contain rules. Such a field must be public, * static, and a subtype of {@link org.junit.rules.TestRule}. * The {@link org.junit.runners.model.Statement} passed * to the {@link org.junit.rules.TestRule} will run any {@link BeforeClass} methods, * then the entire body of the test class (all contained methods, if it is * a standard JUnit test class, or all contained classes, if it is a * {@link org.junit.runners.Suite}), and finally any {@link AfterClass} methods. * * The statement passed to the {@link org.junit.rules.TestRule} will never throw an exception, * and throwing an exception from the {@link org.junit.rules.TestRule} will result in undefined * behavior. This means that some {@link org.junit.rules.TestRule}s, such as * {@link org.junit.rules.ErrorCollector}, * {@link org.junit.rules.ExpectedException}, * and {@link org.junit.rules.Timeout}, * have undefined behavior when used as {@link ClassRule}s. * * If there are multiple * annotated {@link ClassRule}s on a class, they will be applied in an order * that depends on your JVM's implementation of the reflection API, which is * undefined, in general. * * For example, here is a test suite that connects to a server once before * all the test classes run, and disconnects after they are finished: * *
* * @RunWith(Suite.class) * @SuiteClasses({A.class, B.class, C.class}) * public class UsesExternalResource { * public static Server myServer= new Server(); * * @ClassRule * public static ExternalResource resource= new ExternalResource() { * @Override * protected void before() throws Throwable { * myServer.connect(); * }; * * @Override * protected void after() { * myServer.disconnect(); * }; * }; * } ** * For more information and more examples, see {@link org.junit.rules.TestRule}. */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) public @interface ClassRule { }