質問: JUnitでRuleを定義したクラスがあるのですが、ソースの改修により新たに別のRuleも 追加することになりました。 1つのクラスに複数のRuleが存在することが原因だと思うのですが、Ruleの実行順序が 毎回一定ではなく、テスト実行時に意図しない結果になってしまうことがあります。 **ソースコード上のRuleの宣言順序は実際の実行順序とは関係ないのでしょうか?** また、**決まった順序でRuleが実行されるように制御する方法**ってあるのでしょうか?
回答: > >ソースコード上のRuleの宣言順序は実際の実行順序とは関係ないのでしょうか? →はい、関係ありません。(順序は保証されません) > >また、決まった順序でRuleが実行されるように制御する方法ってあるのでしょうか? **org.junit.rules.RuleChain**を使うとRuleの実行順序を制御できますよ。 RuleChainの実行順序は以下メソッドで設定します。(aroundメソッドは入れ子構造で、複数指定可能です。) ・**outerRuleメソッド**・・・最初に初期化し、最後に終了処理を行う一番外側の処理 ・**aroundメソッド**・・・outerRuleで設定したルールの後から初期化し、先に終了処理を行う内側の処理 (例) ``` public class RuleChainExTest { //外側のルールはouterRule、内側のルールはaroundで追加 @Rule public TestRule chain = RuleChain .outerRule(new MyResource1("outer rule")) .around(new MyResource2("inner rule")); @Test public void testSomeMethod() { //targetメソッド実行 } } class MyResource1 extends ExtarnalResource { //省略 } class MyResource2 extends ExtarnalResource { //省略 } ```