Wie die Kraft der statische block ausgeführt wird in jeder test-Methode?
Fand ich static-block ausgeführt wird nur einmal, wenn ich führen Sie mehrere JUnit-tests. Wie kann ich erzwingen, dass es für jede einzelne test-Methode? Ich bin mit neuesten JUnit 4.8.2
Auch nach xUnit-design-Prinzip, jede Methode sollte völlig unabhängig von anderen. Warum static-block nur einmal ausgeführt werden?
@Test TestMethod1 () {
Accounts ac = new Accounts();
ac.method1(); //kill the thread inside
}
@Test TestMethod2 () {
Accounts ac = new Accounts();
ac.method2(); //the thread is no longer available!!
}
class Accounts {
static {
//initalize one thread to monitor something
}
}
Dies passiert auch, wenn TestMethod1 und TestMethod2 sind in den verschiedenen Test-Klassen.
- pls show some code zu erklären, wie Sie es ausführen
- wenn Sie möchten, dass etwas initialisiert, bevor jeder @Test ausführen, tun Sie es in einer @Before annotierten Methode
Du musst angemeldet sein, um einen Kommentar abzugeben.
statische Blöcke nur ausgeführt werden, auf die Klasse be, weil das ist, was Sie sind: Klasse Initialisierungen. Haben ein static-block mehrmals ausgeführt würden verlangen, dass Sie zum entladen der Klasse (nicht eine einfache Sache zu tun...).
Wenn Sie brauchen, um die Verwendung von statischen Blöcke, können Sie kommen mit Möglichkeiten, um Sie zu testen. Warum nicht wickeln Sie den block in eine öffentliche (statische) Methode? Alles, was Sie zu tun haben, dass die Welt ist, testen Sie die Methode:
könnten Sie auch in der Lage sein, um Weg mit nur ein gewöhnlicher Initialisierer
Obwohl, die Wahrheit ist, die meisten Codes nicht verwenden müssen, Initialisierungen, wie das überhaupt.
Edit: Stellt sich heraus, Oracle mag der statischen Methode http://download.oracle.com/javase/tutorial/java/javaOO/initial.html
Denn das ist der springende Punkt, der statische Initialisierer Blöcke!
Oder um es anders auszudrücken, wenn Sie möchten Initialisierungscode auszuführen, mehrere Male, legte es in einem normalen Konstruktor oder Methode, oder (bei einer kleinen Anzahl der Fälle) eine nicht-statische Initialisierer block.
Im Rahmen von JUnit, ist die normale Art und Weise zu implementieren, zu testen startup-und shutdown-code mit
setUp()
undtearDown()
Methoden.Wenn Sie versuchen, unit Tests, die Ausführung der statischen Initialisierung in Ihrem eigenen code, sind Sie für eine holprige Straße, denke ich. Aber dann, unit-Test-code mit statischen Zustand (z.B. singletons) ist immer schwierig ... und das ist einer der Gründe, warum Leute denken, dass die statischen Zustand ist eine schlechte Idee.
Erwägen Sie die Verwendung eines Dependency Injection (auch als Inversion of Control) Rahmen anstelle des singletons.
Alternativ, betrachten änderung Ihrer Singleton /statische Initialisierung code, um es einfacher zu testen. Zum Beispiel, fügen Sie eine statische Methode, die es erlaubt, einen test zu re-führen Sie die Initialisierung. (Und bevor Sie sagen, dass diese bricht das singleton-Muster: ja, ich weiß. Sie müssen wählen zwischen design /Umsetzung "Reinheit" und das testen zu vereinfachen.)
startup()
undshutdown()
. Wenn Sie möchten, dass die test-Methoden, um völlig unabhängig ist, könnte Sie jeder in seine eigene Klasse.Ist die statische code für die tests für die Klasse getestet?
Wenn der code statisch ist, so können die Prüfungen teilen, dann müssen Sie verschieben Sie den code in der eigenen Klasse. Dann entweder haben die test-Klasse-Konstruktor instanziiert eine statische Instanz oder erstellen Sie eine test-suite, die nicht die gleiche Sache.
Wenn Sie wollen, dass jeder test für sich allein stehen, dann bewegen Sie was Sie tun im static-block in der setup()/teardown () - Methoden, es ist was Sie sind da für.
Static-block wird nur einmal ausgeführt wird wenn das erste mal, Klasse laden in die JVM. Junit bieten
@Before
Anmerkung, die im Grunde verwendet, für die erforderliche Initialisierung her Testfall. Dies kann verwendet werden, für die Ausführung der statischen Blöcke der Klasse. ich habe zum Beispiel folgende KlasseCar
und ich ausgeführt werden soll static-block dieser Klasse in Junit vor dem erstellen der Auto-Instanz. Ich habe das laden dieser Klasse in
setUp()
mitclass.forName("package.ClassName")
Junit-code.Ähm... machen es nicht-statische? Sie können Instanz-Initialisierer Blöcke zu (gleiche wie statische Blöcke, nur ohne die
static
Stichwort). Aber test-setup code sollte eigentlich gehen in eine explizitesetUp()
oder@Before
Methode.