diff --git a/src/main/java/org/junit/Test.java b/src/main/java/org/junit/Test.java index 1d178ece3d6a..592abdac32ad 100644 --- a/src/main/java/org/junit/Test.java +++ b/src/main/java/org/junit/Test.java @@ -95,4 +95,10 @@ private None() { *

*/ long timeout() default 0L; + + /** + * Optionally specify the execution order of a test method. Methods are executed from the lowest order + * to the highest. + */ + int order() default 0; } diff --git a/src/main/java/org/junit/internal/MethodSorter.java b/src/main/java/org/junit/internal/MethodSorter.java index d8e661aa8824..e0b3d449284d 100644 --- a/src/main/java/org/junit/internal/MethodSorter.java +++ b/src/main/java/org/junit/internal/MethodSorter.java @@ -5,6 +5,7 @@ import java.util.Comparator; import org.junit.FixMethodOrder; +import org.junit.Test; public class MethodSorter { /** @@ -34,6 +35,17 @@ public int compare(Method m1, Method m2) { } }; + /** + * Sort order using {@link Test#order()} attributes + */ + public static Comparator METHOD_ORDER = new Comparator() { + public int compare(Method m1, Method m2) { + final Test t1 = m1.getAnnotation(Test.class); + final Test t2 = m2.getAnnotation(Test.class); + return (t1 != null ? t1.order() : 0) - (t2 != null ? t2.order() : 0); + } + }; + /** * Gets declared methods of a class in a predictable order, unless @FixMethodOrder(MethodSorters.JVM) is specified. * diff --git a/src/main/java/org/junit/runners/MethodSorters.java b/src/main/java/org/junit/runners/MethodSorters.java index 5821892f0553..1fb9ee8fb5d2 100644 --- a/src/main/java/org/junit/runners/MethodSorters.java +++ b/src/main/java/org/junit/runners/MethodSorters.java @@ -3,6 +3,7 @@ import java.lang.reflect.Method; import java.util.Comparator; +import org.junit.Test; import org.junit.internal.MethodSorter; /** @@ -18,6 +19,11 @@ public enum MethodSorters { */ NAME_ASCENDING(MethodSorter.NAME_ASCENDING), + /** + * Sorts the test methods using {@link Test#order()} attributes + */ + METHOD_ORDER(MethodSorter.METHOD_ORDER), + /** * Leaves the test methods in the order returned by the JVM. * Note that the order from the JVM may vary from run to run diff --git a/src/test/java/org/junit/internal/MethodSorterTest.java b/src/test/java/org/junit/internal/MethodSorterTest.java index 1934fa2d7e27..298019d1f4a7 100644 --- a/src/test/java/org/junit/internal/MethodSorterTest.java +++ b/src/test/java/org/junit/internal/MethodSorterTest.java @@ -179,4 +179,40 @@ public void testAscendingMethodSorter() { List actual = getDeclaredMethodNames(DummySortWithNameAsc.class); assertEquals(expected, actual); } + + @FixMethodOrder(MethodSorters.METHOD_ORDER) + static class DummySortWithMethodOrder { + @Test(order=1) + Object alpha(int i, double d, Thread t) { + return null; + } + + @Test(order=2) + void beta(int[][] x) { + } + + @Test(order=5) + int gamma() { + return 0; + } + + @Test(order=6) + void gamma(boolean b) { + } + + @Test(order=3) + void delta() { + } + + @Test(order=4) + void epsilon() { + } + } + + @Test + public void testMethodOrderSorter() { + List expected = Arrays.asList(ALPHA, BETA, DELTA, EPSILON, GAMMA_VOID, GAMMA_BOOLEAN); + List actual = getDeclaredMethodNames(DummySortWithMethodOrder.class); + assertEquals(expected, actual); + } }