2

高レベル、私は非常に簡単な JUnit テスト クラスを持っています。いくつかの @Tests と、いくつかのセットアップを行う単一の @Before があります。1 つのテスト ケースでは、セットアップが異なります (実行したくありません)。

いくつかの検索から、https://stackoverflow.com/a/13017452/413254を見つけました。これは、特定のアノテーションをチェックして @Before ステートメントを実行する @Rule を作成することを提案します。

私の混乱は、ルールで @Before メソッドを実行する方法に関するものです。それを行う方法はありますか?または、テスト クラス自体を渡して @before メソッドを実行する必要がありsetup()ますか (以下の例)。

public class NoBeforeRule implements TestRule {

    @Override
    public Statement apply(final Statement base, final Description description) {
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                if (description.getAnnotation(NoBefore.class) == null) {
                    // Is there something like `base.executeAllTheBefores()' 
                }

                base.evaluate();
            }
        };
    }
}

関連するテスト コード:

@Rule public NoBeforeRule mNoBeforeRule = new NoBeforeRule(this);

@Before
@Override
public void setup() {
}

@Test
public void testNeedSetup() {
    // this should run setup()
}

@NoBefore
@Test
public void testNoSetup() {
    // this should NOT run setup()
}
4

3 に答える 3

3

テストを 2 つの別個のテスト クラスに分割してみませんか? セットアップが必要なものはあるクラスに入り、必要のないものは別のクラスに入ります。

クラスのすべてのテストを 1 つのテスト クラスに入れなければならないというルール (またはガイドライン) はありません。実際、これは私が頻繁に行っていることです。

共通のセットアップを必要としない単一または複数のテストがあるという事実は、おそらく、テスト自体がまとまりがなく、テスト対象のクラスの異なるバリエーションをテストしていることを示しています。たとえば、ポジティブ テスト用に特定の方法でモック セットアップを行うメソッドが多数ある場合がありますが、失敗シナリオ用に別の方法で構成する必要がある他のテストがあります。これらのテストを 2 つのクラスに分けます。具体的には、肯定的なシナリオのテストと失敗のシナリオのテストです。

ルールなどをいじって、標準メソッドの実行を明示的に回避@Beforeすると、物事がより複雑になり、セットアップ メソッドが実行されない理由について、将来の自分や同僚が頭を悩ませます。

于 2015-04-12T11:31:37.700 に答える
1

たぶん、ルール TestName で遊んでください

@Rule public TestName name = new TestName();

@Before 
public void setup() {
     if(listOfTestNeedSetup.contains(name.getMethodName()) {
        // need setup
     }
}
于 2015-04-09T17:14:41.297 に答える