いくつかのテストを使用してクラスを@Beforeセットアップしましたが、使用するのではなく、すべてのテストの前に 1 回だけ実行するセットアップ メソッドが必要です。Junit 4.8でそれは可能ですか?
13 に答える
私は@assyliasに同意しますが、使用する@BeforeClassことは古典的な解決策であり、常に便利であるとは限りません。注釈が付けられたメソッド@BeforeClassは静的でなければなりません。テストケースのインスタンスを必要とする一部のテストでは非常に不便です。たとえば、Spring@Autowiredコンテキストで定義されたサービスを操作するために使用するSpringベースのテスト。
この場合、私は個人的にsetUp()注釈付きの通常のメソッドを使用@Beforeし、カスタムstatic(!)  booleanフラグを管理します。
private static boolean setUpIsDone = false;
.....
@Before
public void setUp() {
    if (setUpIsDone) {
        return;
    }
    // do the setup
    setUpIsDone = true;
}
    注釈を使用できますBeforeClass:
@BeforeClass
public static void setUpClass() {
    //executed only once, before the first test
}
    編集: デバッグ中に、クラスがすべてのテストの前にもインスタンス化されていることがわかりました。ここでは @BeforeClass アノテーションが最適だと思います。
コンストラクターにも設定できます。テストクラスは結局のところクラスです。他のほとんどすべてのメソッドには注釈が付けられているため、それが悪い習慣であるかどうかはわかりませんが、機能します。次のようなコンストラクタを作成できます。
public UT () {
    // initialize once here
}
@Test
// Some test here...
ctor は静的ではないため、テストの前に呼び出されます。
JUnit 5 @BeforeAll は、テスト クラスのライフサイクルがクラスごとである場合、非静的にすることができます。つまり、テスト クラスに a のアノテーションを付ければ、準備完了@TestInstance(Lifecycle.PER_CLASS)です。
私の汚い解決策は次のとおりです。
public class TestCaseExtended extends TestCase {
    private boolean isInitialized = false;
    private int serId;
    @Override
    public void setUp() throws Exception {
        super.setUp();
        if(!isInitialized) {
            loadSaveNewSerId();
            emptyTestResultsDirectory();
            isInitialized = true;
        }
    }
   ...
}
すべてのテストケースのベースとして使用しています。
しばらく実験した後、これが私の解決策です。春のブートテストにはこれが必要でした。@PostConstruct を使用してみましたが、残念ながらすべてのテストで実行されます。
public class TestClass {
    private static TestClass testClass = null;
    @Before
    public void setUp() {
        if (testClass == null) {
            // set up once
            ...
            testClass = this;
        }
    }
    @AfterClass
    public static void cleanUpAfterAll() {
        testClass.cleanUpAfterAllTests();
    }
    private void cleanUpAfterAllTests() {
        // final cleanup after all tests
        ...
    }
    @Test
    public void test1() {
        // test 1
        ...
    }
    @Test
    public void test2() {
        // test 2
        ...
    }
}