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);
+ }
}