各@Testで@BeforeEachメソッドのパラメータを提供する方法

デビッド:

私は、テストリソースをロードし、それをいくつかの他のものを初期化する必要があり、各試験の前にJUnitを5でいくつかのJUnitテストを書いています。私が書いたことについて、私のinitメソッドはで注釈を付け@BeforeEach、その進捗状況が常に負荷へのリソースはテストごとに異なるものでなければならないことを除いて同じであるため、。
@BeforeEach注釈を除去するI最初に考え、ロードする必要のあるリソースを指定し、初めに各テスト内からinitメソッドを自分自身を呼び出すためのinitメソッドにパラメータを追加します。

import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.api.Test;

public class MyTest {
   private Object testResource;

   private void init(String resourcePath) {
      // actually load the resource and initialize some fields here
      this.testResource = "Loaded resource from: " + resourcePath;
   }

   @Test
   public void test0() {
      init("TestResource0");
      assertEquals("Loaded resource from: TestResource0", testResource);
   }

   @Test
   public void test1() {
      init("TestResource1");
      assertEquals("Loaded resource from: TestResource1", testResource);
   }

}

私はJUnitのに頼るつもりだ例えば、いくつかの空想のメタ・テスト・プログラムによって、テストを拡張するときには、将来的にいくつかの問題を引き起こす可能性があることを、私はJUnitテストフローの全体構造を弱体化していると私は恐れているように私は感じている方法テストの現在の状態に関する正確な情報を提供します。
だから私は、initメソッドに負荷へのリソースのためのパラメータを保持し、維持することを決定した@BeforeEach注釈を。私は含めるために必要なその方法ParameterResolver実装についての私の最初に考えたのはresolveParameter(ParameterContext, ExtensionContext)最初のテストが実行され、そのテストのためにロードすることに対応するリソースを返すされようとしているかを調べることでした。

static class MyParamResolver implements ParameterResolver {

      @Override
      public Object resolveParameter(ParameterContext parameterContext,
                                     ExtensionContext extensionContext) throws ParameterResolutionException {

         String test = extensionContext.getRequiredTestMethod()
                                       .getName();

         switch (test) {
         case "test0":
            return "TestResource0";
         case "test1":
            return "TestResource1";
         }

         throw new ParameterResolutionException("Unknown test " + test);
      }

      @Override
      public boolean supportsParameter(ParameterContext parameterContext,
                                       ExtensionContext extensionContext) {
         return true;
      }

   }

名前は明らかに一目で対応するテストに接続されていないロードするコンパイラと第二のリソースによって保証正しいことのために、私は最初のdont安全性を持っているので、私は、そのソリューション好きではありません。私は直接試験法に添付されたアノテーションに何とかリソースパスを提供するためにいいだろうと思いました。そんな感じ:

@Test("test0")
public void test0() {
    assertEquals("Loaded resource from: TestResource0", testResource);
}

@Test("test1")
public void test1() {
   assertEquals("Loaded resource from: TestResource1", testResource);
}

...

    @Override
    public Object resolveParameter(ParameterContext parameterContext,
                                   ExtensionContext extensionContext) {

        return extensionContext.getRequiredTestMethod()
                               .getAnnotation(Test.class)
                               .value();
     }

残念ながら@Test、アノテーションは、任意のパラメータを定義していないとJUnitのドキュメントにおけるいくつかの研究の後、私はここで他の注釈フィッティングを見つけることができませんでした。私は今の考えることができる最善のことは、私自身の注釈を作成し、各テストメソッドの上にそれを置くことです。しかし、私はまた、これはWEEL自分自身を再発明することなく、解決することができる共通の問題、だと思います。私は何かを見つけることができませんでした。
自分の注釈を考案する必要はありません。この問題を解決するための便利な方法があります。言い換えれば、ただそこにすでにあるフレームワークAPIを使用してこの問題を解決するために、コードの品質と読みやすさをアップし続ける簡単な方法は、ありますか?

Dakshinamurthy Karra:

ParameterizedTestあなたは、テストのために同じ手順を持っていますが、異なるパラメータでそれを実行したい場合に便利です。それはケースではないようです。あなたは、単に使用することができますTestInfoにパラメータを@BeforeEachあなたのケースを処理する方法。

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;

public class JUnitTest {

    @Test public void test1() {
        System.out.println("Test");
    }

    @BeforeEach public void f(TestInfo info) {
        System.out.println(info.getDisplayName());
    }
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=202259&siteId=1