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 reference rules or methods that return them. A field must be public, * static, and a subtype of {@link org.junit.rules.TestRule}. A method must be public static, and return * 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. However, Rules defined by fields will always be applied * before Rules defined by methods. *

* 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();
 *      }
 *   };
 * }
 * 
*

* and the same using a method *

 * @RunWith(Suite.class)
 * @SuiteClasses({A.class, B.class, C.class})
 * public class UsesExternalResource {
 *     public static Server myServer= new Server();
 *
 *     @ClassRule
 *     public static ExternalResource getResource() {
 *         return 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}. * * @since 4.9 */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.METHOD}) public @interface ClassRule { }