1. ホーム
  2. java

[解決済み] JUnit 4で条件付きでテストを無視する

2022-03-24 21:08:20

質問

OK、では @Ignore アノテーションは、あるテストケースを実行すべきでないことを示すのに適しています。

しかし、時には実行時の情報に基づいてテストを無視したいこともあります。 例えば、あるコア数のマシンで実行する必要のある並行処理テストがある場合です。 このテストがユニプロセッサのマシンで実行された場合、(まだ実行されていないので)テストをパスするのは正しくないと思いますし、テストに失敗してビルドが壊れるのは間違いなく正しくありません。

そのため、実行時にテストを無視できるようにしたいのです。これが正しい結果のように思えるからです(テストフレームワークはビルドを通過させるが、テストが実行されなかったことを記録するため)。 アノテーションがこのような柔軟性を与えてくれないことは確かで、 問題となるクラスのテストスイートを手動で作成する必要があると思われます。 しかし、ドキュメントにはこのことについて何も書かれておらず、 また API のインスタンスをプログラムで作成するにはどうすればよいのだろうか? Test などで作成されたものと同等である。 @Ignore アノテーション?)

もし、過去に同じようなことをしたことのある方や、他にどうしたらいいかという明るいアイデアをお持ちの方がいらっしゃいましたら、教えていただければと思います。

解決方法は?

JUnitの方法は、これを実行時に行うには org.junit.Assume .

 @Before
 public void beforeMethod() {
     org.junit.Assume.assumeTrue(someCondition());
     // rest of setup.
 }

の中で行うことができます。 @Before メソッドやテストそのものには適用されません。 @After メソッドを使用します。テストそのものでやると @Before メソッドが実行されます。また @BeforeClass を使用すると、クラスの初期化を防ぐことができます。

想定外の失敗があると、テストが無視されます。

編集してください。 と比較するために @RunIf のアノテーションを使用します。 junit-ext であれば、そのサンプルコードは次のようになります。

@Test
public void calculateTotalSalary() {
    assumeThat(Database.connect(), is(notNull()));
    //test code below.
}

からの接続をキャプチャして使用する方がはるかに簡単であることは言うまでもありません。 Database.connect() メソッドをこのように使用します。