web-dev-qa-db-ja.com

JUnit @BeforeClass Spring Bootアプリケーションの非静的な回避策

JUnitの@BeforeClassアノテーションは、すべての@Testメソッド。ただし、これは依存性注入では使用できません。

データベースをクリーンアップしたい@Autowire JUnitテストを実行する前に、Spring Bootで1回。私はできない @Autowire静的フィールドなので、回避策を考える必要があります。何か案は?

18
Kingamere

@Before@BeforeClassの代わり)(またはBeforeTransaction(データベースの初期化方法に応じて)を使用してください)。この注釈は、非静的パブリックメソッドに添付する必要があります。

もちろん:@Before各テストケースメソッドの前に実行します(一度だけ実行する@BeforeClassとは異なります)。しかし、一度だけ実行したい場合は、静的マーカーフィールドを使用します。

private static boolean initialized = false;
...
@Before
public void initializeDB() { 
   if (!initialized) {
       ... //your db initialization
       initialized = true;
   }
}
---
30
Ralph

DBUnit ライブラリをご覧ください。これは、説明しているアクションを実行するように設計されています。データベースインスタンスを作成および破棄でき、これを行う簡単な方法を提供します。

1
TrueDub

_JUnit5_テスト実行順序 および@TestInstance(Lifecycle.PER_CLASS)

Kotlinの例:

_@ExtendWith(SpringExtension::class)
@TestInstance(PER_CLASS)
class BeforeInstanceTests {

    private var initialized: String = ""
    private val callList: MutableList<String> = ArrayList()

    @BeforeAll
    fun beforeAllNonStatic() {
        initialized = "initialized"
        assertEquals(0, callList.size)
    }

    @Test
    fun test1() {
        assertEquals("initialized", initialized)
        callList.add("test1")
    }

    @Test
    fun test2() {
        assertEquals("initialized", initialized)
        callList.add("test2")
    }

    @Test
    fun test3() {
        assertEquals("initialized", initialized)
        callList.add("test3")
    }

    @AfterAll
    fun afterAllNonStatic() {
        assertEquals("initialized", initialized)
        assertEquals(3, callList.size)
        assertTrue(callList.contains("test1"))
        assertTrue(callList.contains("test2"))
        assertTrue(callList.contains("test3"))

        callList.clear()
        initialized = ""
    }
}
_
0
radistao

受け入れられた答えは賢明ですが、ハッキーなようです。通常のコンストラクタを使用してみましたか?

public class MyJUnitTest {

    public MyJUnitTest() {
       // code for initializeDB
    }

    // Tests

}
0
Arun Avanathan

この解決策を試してください: https://stackoverflow.com/a/46274919/907576

@BeforeAllMethods/@AfterAllMethodsアノテーションを使用すると、注入されたすべての値が使用可能なインスタンスコンテキストでTestクラスの任意のメソッドを実行できます。

0
radistao