webentwicklung-frage-antwort-db.com.de

JUnit @BeforeClass nicht statische Arbeit für Spring Boot-Anwendung

Die Annotation @BeforeClass von JUnit muss als statisch deklariert werden, wenn sie vor allen @Test-Methoden einmal ausgeführt werden soll. Dies kann jedoch nicht mit Abhängigkeitseinspritzung verwendet werden.

Ich möchte eine Datenbank bereinigen, die ich mit Spring Boot @Autowire einmal __e, bevor ich meine JUnit-Tests durchführe. Ich kann keine statischen Felder @Autowire, also muss ich an eine Umgehung denken. Irgendwelche Ideen?

14
Kingamere

Verwenden Sie einfach @Before (anstelle von @BeforeClass) (oder BeforeTransaction (abhängig davon, wie Sie die Datenbank initialisieren)). Diese Anmerkung muss an eine nicht statische öffentliche Methode angehängt sein.

Natürlich: @Before wird vor jeder Testfallmethode ausgeführt (nicht wie @BeforeClass, das nur einmal ausgeführt wird.) Wenn Sie es jedoch genau einmal ausführen möchten, verwenden Sie ein statisches Markierungsfeld.

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

Versuchen Sie diese Lösung: https://stackoverflow.com/a/46274919/907576 :

mit den Annotationen @BeforeAllMethods/@AfterAllMethods können Sie eine beliebige Methode in der Test-Klasse in einem Instanzkontext ausführen, in der alle injizierten Werte verfügbar sind. 

1
radistao

Für JUnit5: Testausführungsreihenfolge und @TestInstance(Lifecycle.PER_CLASS)

Beispiel 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

Obwohl die akzeptierte Antwort klug ist, scheint sie gehackt zu sein. Haben Sie es mit einem normalen Konstruktor versucht? 

public class MyJUnitTest {

    public MyJUnitTest() {
       // code for initializeDB
    }

    // Tests

}
0
Arun Avanathan

Schauen Sie sich die Bibliothek " DBUnit " an, die die von Ihnen beschriebenen Aktionen ausführt. Es kann Datenbankinstanzen erstellen und abbauen und bietet Ihnen einfache Möglichkeiten, dies zu tun.

0
TrueDub