7

runner を拡張する suiterunner を作成して、パーソナライズされたテスト スイートを作成しようとしています。i の注釈が付けられたテスト スイートでは、@RunWith(suiterunner.class)実行する必要があるテスト クラスを参照しています。

テストクラス内で、特定のテストを繰り返す必要があります。そのために、ここで説明したソリューションを使用しています: http://codehowtos.blogspot.com/2011/04/run-junit-test-repeatedly.html。しかし、テストクラスをトリガーするスイートランナーを作成し、そのテストクラス内で実装@RunWith(ExtendedRunner.class)しているため、初期化エラーがスローされます。

これらの 2 つのランナーを管理するのに助けが必要ですが、特定のテストのために 2 つのランナーを組み合わせる方法はありますか? この問題を解決する他の方法や、より簡単な方法はありますか?

4

1 に答える 1

2

最新の JUnit を使用している場合は、@Rules を使用すると、問題に対するよりクリーンなソリューションになる可能性があります。これがサンプルです。

これがあなたのアプリケーションだと想像してください。

package org.zero.samples.junit;

/**
 * Hello world!
 * 
 */
public class App {
  public static void main(String[] args) {
    System.out.println(new App().getMessage());
  }

  String getMessage() {
    return "Hello, world!";
  }
}

これがテスト クラスです。

package org.zero.samples.junit;

import static org.junit.Assert.*;

import org.junit.Rule;
import org.junit.Test;

/**
 * Unit test for simple App.
 */
public class AppTest {

  @Rule
  public RepeatRule repeatRule = new RepeatRule(3); // Note Rule

  @Test
  public void testMessage() {
    assertEquals("Hello, world!", new App().getMessage());
  }
}

次のようなルール クラスを作成します。

package org.zero.samples.junit;

import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;

public class RepeatRule implements TestRule {

  private int repeatFor;

  public RepeatRule(int repeatFor) {
    this.repeatFor = repeatFor;
  }

  public Statement apply(final Statement base, Description description) {
    return new Statement() {

      @Override
      public void evaluate() throws Throwable {
        for (int i = 0; i < repeatFor; i++) {
          base.evaluate();
        }
      }
    };
  }

}

いつものようにテスト ケースを実行しますが、今回はテスト ケースが指定された回数だけ繰り返されます。@Rule が実際に便利であることが証明される興味深い使用例が見つかるかもしれません。複合ルールを作ってみて、遊んでみるときっと釘付けになる..

それが役立つことを願っています。

于 2013-06-04T08:35:05.853 に答える