How to run test methods in specific order in JUnit4?

后端 未结 18 2265
伪装坚强ぢ
伪装坚强ぢ 2020-11-22 04:35

I want to execute test methods which are annotated by @Test in specific order.

For example:

public class MyTest {
    @Test public void          


        
18条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-11-22 04:58

    Its one of the main issue which I faced when I worked on Junit and I came up with following solution which works fine for me:

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    
    import org.junit.runners.BlockJUnit4ClassRunner;
    import org.junit.runners.model.FrameworkMethod;
    import org.junit.runners.model.InitializationError;
    
    public class OrderedRunner extends BlockJUnit4ClassRunner {
    
        public OrderedRunner(Class clazz) throws InitializationError {
            super(clazz);
        }
    
        @Override
        protected List computeTestMethods() {
            List list = super.computeTestMethods();
            List copy = new ArrayList(list);
            Collections.sort(copy, new Comparator() {
    
                @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.order() - o2.order();
                }
            });
            return copy;
        }
    }
    

    also create a interface like below:

     @Retention(RetentionPolicy.RUNTIME)
    
    
    @Target({ ElementType.METHOD})
    
    public @interface Order {
    public int order();
    }
    

    Now suppose you have class A where you have written several test cases like below:

    (@runWith=OrderRunner.class)
    Class A{
    @Test
    @Order(order = 1)
    
    void method(){
    
    //do something
    
    }
    
    }
    

    So execution will start from method named "method()". Thanks!

提交回复
热议问题