When using junit with spring framework for test, to sort execute order of method, will use FixMethodOrder class. It is a little inconvenience because you need to name your test method in correct way.
Execute test method ordered by method name
package com.prhythm.test;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* Created by nanashi07 on 15/6/20.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/application-context.xml")
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class OrderedTest {
@Test
public void test1() {
System.out.println("test1 executed");
}
@Test
public void test2() {
System.out.println("test2 executed");
}
@Test
public void test3() {
System.out.println("test3 executed");
}
@Test
public void test4() {
System.out.println("test4 executed");
}
}
Result:
test1 executed test2 executed test3 executed test4 executed
Now there is an another way to do it.
Create a order annotation for customize order
package org.springframework.test.context.junit4;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* Created by nanashi07 on 15/6/20.
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface Order {
int value();
}
Create a junit runner extends SpringJUnit4ClassRunner
package org.springframework.test.context.junit4;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.InitializationError;
import org.springframework.test.context.TestContextManager;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class SpringJUnit4ClassOrderedRunner extends SpringJUnit4ClassRunner {
/**
* Constructs a new {@code SpringJUnit4ClassRunner} and initializes a
* {@link TestContextManager} to provide Spring testing functionality to
* standard JUnit tests.
*
* @param clazz the test class to be run
* @see #createTestContextManager(Class)
*/
public SpringJUnit4ClassOrderedRunner(Class<?> clazz) throws InitializationError {
super(clazz);
}
@Override
protected List<FrameworkMethod> computeTestMethods() {
List<FrameworkMethod> list = super.computeTestMethods();
Collections.sort(list, new Comparator<FrameworkMethod>() {
@Override
public int compare(FrameworkMethod f1, FrameworkMethod f2) {
Order o1 = f1.getAnnotation(Order.class);
Order o2 = f2.getAnnotation(Order.class);
if (o1 == null || o2 == null)
return -1;
return o1.value() - o2.value();
}
});
return list;
}
}
Run test as customized order
package com.prhythm.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.Order;
import org.springframework.test.context.junit4.SpringJUnit4ClassOrderedRunner;
/**
* Created by nanashi07 on 15/6/20.
*/
@RunWith(SpringJUnit4ClassOrderedRunner.class)
@ContextConfiguration("classpath:spring/application-context.xml")
public class OrderedTest {
@Test
@Order(value = 4)
public void test1() {
System.out.println("test1 executed");
}
@Test
@Order(value = 3)
public void test2() {
System.out.println("test2 executed");
}
@Test
@Order(value = 2)
public void test3() {
System.out.println("test3 executed");
}
@Test
@Order(value = 1)
public void test4() {
System.out.println("test4 executed");
}
}
Result:
test4 executed test3 executed test2 executed test1 executed