Wie ist der Lebenszyklus einer Erweiterungsinstanz, die versucht, eine Erweiterung für JUnit 5 (JUnit Jupiter) zu schreiben? Machen Sie ein Memorandum.
TL;TR
@ RegisterExtension
Das Erweiterungsmodell von JUnit 5 ist ein Mechanismus zum Standardisieren der Vorverarbeitung, Nachbearbeitung, Ausnahmeverarbeitung usw. für jeden Test. Der Freiheitsgrad ist niedriger als der der "Regel" von Junit 4, aber Sie können einfach eine Erweiterung erstellen, indem Sie eine Schnittstelle implementieren, die Erweiterungspunkte unterstützt.
Es gibt drei Möglichkeiten, die Erweiterung zu verwenden.
Verwenden Sie dieses Mal die Methoden 1 und 2, um zu überprüfen, wann die Erweiterungsinstanz erstellt wurde.
FooExtension.java
import org.junit.jupiter.api.extension.*;
public class FooExtension implements BeforeEachCallback, AfterEachCallback, BeforeAllCallback, AfterAllCallback {
{
System.out.println(String.format("[%s] created", this.toString()));
}
@Override
public void beforeAll(ExtensionContext extensionContext) throws Exception {
System.out.println(String.format("[%s] before all", this.toString()));
}
@Override
public void beforeEach(ExtensionContext context) throws Exception {
System.out.println(String.format("[%s] before each", this.toString()));
}
@Override
public void afterEach(ExtensionContext extensionContext) throws Exception {
System.out.println(String.format("[%s] after each", this.toString()));
}
@Override
public void afterAll(ExtensionContext extensionContext) throws Exception {
System.out.println(String.format("[%s] after all", this.toString()));
}
}
@ExtendWith(FooExtension.class)
public class ExtensionTest {
@Test
void test1() { System.out.println("test 1"); }
@Test
void test2() { System.out.println("test 2"); }
@Test
void test3() { System.out.println("test 3"); }
}
[example.FooExtension@70325e14] created
[example.FooExtension@70325e14] before all
[example.FooExtension@70325e14] before each
test 1
[example.FooExtension@70325e14] after each
[example.FooExtension@70325e14] before each
test 2
[example.FooExtension@70325e14] after each
[example.FooExtension@70325e14] before each
test 3
[example.FooExtension@70325e14] after each
[example.FooExtension@70325e14] after all
Sie können sehen, dass jeder Test eine Erweiterungsinstanz gemeinsam nutzt. Für jeden Test wird eine Instanz von ExtensionTest erstellt. Das gleiche Ergebnis wurde jedoch erzielt, wenn die ErweiterungTest-Instanz für "@TestInstance (Lifecycle.PER_CLASS)" freigegeben wurde.
@ RegisterExtension
+ Registererweiterung mit statischem FeldSecondExtensionTest.java
public class SecondExtensionTest {
@RegisterExtension
static FooExtension fooExtension = new FooExtension();
@Test
void test1() { System.out.println("test 1"); }
@Test
void test2() { System.out.println("test 2"); }
@Test
void test3() { System.out.println("test 3"); }
}
[example.FooExtension@55183b20] created
[example.FooExtension@55183b20] before all
[example.FooExtension@55183b20] before each
test 1
[example.FooExtension@55183b20] after each
[example.FooExtension@55183b20] before each
test 2
[example.FooExtension@55183b20] after each
[example.FooExtension@55183b20] before each
test 3
[example.FooExtension@55183b20] after each
[example.FooExtension@55183b20] after all
Da es sich um ein statisches Feld handelt, wird natürlich dieselbe Instanz gemeinsam genutzt.
@ RegisterExtension
+ nicht statischem FeldEntfernen wir die "statische" der "fooExtension" des SecondExtensionTest.
Lifecycle.PER_METHOD
SecondExtensionTest.java
public class SecondExtensionTest {
@RegisterExtension
- static FooExtension fooExtension = new FooExtension();
+ FooExtension fooExtension = new FooExtension();
//Unterlassung
}
[example.FooExtension@40a4337a] created
[example.FooExtension@40a4337a] before each
test 1
[example.FooExtension@40a4337a] after each
[example.FooExtension@fa4c865] created
[example.FooExtension@fa4c865] before each
test 2
[example.FooExtension@fa4c865] after each
[example.FooExtension@3bd82cf5] created
[example.FooExtension@3bd82cf5] before each
test 3
[example.FooExtension@3bd82cf5] after each
Sie können sehen, dass jeder Test eine andere Instanz von Extension hat. Dies liegt daran, dass für jeden Test eine Instanz von SecondExtensionTest selbst generiert wird. BeforeAll und AfterAll funktionieren nicht, aber Sie müssen sie im Fall von "Lifecycle.PER_METHOD" statisch machen, wie beim Hinzufügen von "@ BeforeAll" zur Methode.
Lifecycle.PER_CLASS
Machen wir den Lebenszyklus des zweiten Erweiterungstests zu einer Form, in der eine Instanz nur einmal erstellt wird.
SecondExtensionTest.java
+ @TestInstance(Lifecycle.PER_CLASS)
public class SecondExtensionTest {
@RegisterExtension
FooExtension fooExtension = new FooExtension();
//Unterlassung
}
[example.FooExtension@c730b35] created
[example.FooExtension@c730b35] before all
[example.FooExtension@c730b35] before each
test 1
[example.FooExtension@c730b35] after each
[example.FooExtension@c730b35] before each
test 2
[example.FooExtension@c730b35] after each
[example.FooExtension@c730b35] before each
test 3
[example.FooExtension@c730b35] after each
[example.FooExtension@c730b35] after all
Die Erweiterungsinstanz wird gemeinsam genutzt. Außerdem funktionieren Before All und After All jetzt. Wenn Sie auf diese Weise eine Erweiterung in einem nicht statischen Feld registrieren, hängt dies natürlich vom Lebenszyklus der ursprünglichen Testklasse ab.
https://junit.org/junit5/docs/current/user-guide/#extensions
Recommended Posts