001    package org.junit.runner;
002    
003    import java.lang.annotation.ElementType;
004    import java.lang.annotation.Inherited;
005    import java.lang.annotation.Retention;
006    import java.lang.annotation.RetentionPolicy;
007    import java.lang.annotation.Target;
008    
009    /**
010     * When a class is annotated with <code>&#064;RunWith</code> or extends a class annotated
011     * with <code>&#064;RunWith</code>, JUnit will invoke the class it references to run the
012     * tests in that class instead of the runner built into JUnit. We added this feature late
013     * in development. While it seems powerful we expect the runner API to change as we learn
014     * how people really use it. Some of the classes that are currently internal will likely
015     * be refined and become public.
016     *
017     * For example, suites in JUnit 4 are built using RunWith, and a custom runner named Suite:
018     *
019     * <pre>
020     * &#064;RunWith(Suite.class)
021     * &#064;SuiteClasses({ATest.class, BTest.class, CTest.class})
022     * public class ABCSuite {
023     * }
024     * </pre>
025     *
026     * @since 4.0
027     */
028    @Retention(RetentionPolicy.RUNTIME)
029    @Target(ElementType.TYPE)
030    @Inherited
031    public @interface RunWith {
032        /**
033         * @return a Runner class (must have a constructor that takes a single Class to run)
034         */
035        Class<? extends Runner> value();
036    }