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?
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;
}
}
---
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.
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 = ""
}
}
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
}
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.