JUnit4 を使っていて、テストケースの実行順序をメソッド名によるソート@FixMethodOrderも悪くはないのですが
任意に順番を指定する良い方法はないかと探していたら、やはり自作するしかないようで
自作でも良いから簡単な方法は?と探してたらありました。(面倒くさくて他人に頼ってしまう。。)
https://sui.hateblo.jp/entry/20121003/p1
でも、ここに書いてある通りのコードを実行すると、
@Override protected List<FrameworkMethod> computeTestMethods() { List<FrameworkMethod> list = super.computeTestMethods(); Collections.sort(list, new Comparator<FrameworkMethod>() {
この Collections.sort で、例外発生してしまいました。
java.lang.UnsupportedOperationException
at java.base/java.util.Collections$UnmodifiableList.sort(Collections.java:1330)
at java.base/java.util.Collections.sort(Collections.java:177)
残念、せっかく書いてくださりこれは助かったと思ったのですが。。
BlockJUnit4ClassRunner の super.computeTestMethods() で取得するリストが、
Collections.unmodifiableList で生成するリストだったんですね。
これなら、UnsupportedOperationException が発生しても仕方ないです。
結構古い記事だったので、JUnit バージョンが古くて、今のバージョンではダメになったのかな。
そこで、改めて書き留めておくと。。。
import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * Order */ @Retention(RetentionPolicy.RUNTIME) public @interface Order { int value(); }
import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; import org.junit.runners.BlockJUnit4ClassRunner; import org.junit.runners.model.FrameworkMethod; import org.junit.runners.model.InitializationError; /** * OrderedRunner */ public class OrderedRunner extends BlockJUnit4ClassRunner { public OrderedRunner(Class<?> cls) throws InitializationError { super(cls); } @Override protected List<FrameworkMethod> computeTestMethods() { List<FrameworkMethod> list = super.computeTestMethods(); return list.stream().sorted(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(); } }).collect(Collectors.toList()); } }
テストプログラムは、、、
import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(OrderedRunner.class) public class SampleTest{ @Before public void init() { } @Test @Order(1) public void atest() { } @Test @Order(2) public void test2() { } @Test @Order(3) public void test1() { } }