3.1 Anmerkungen @BeforeEach, @AfterEach
Beachten Sie, dass wir im vorherigen Beispiel in jeder Methode Code schreiben mussten, um ein Objekt zu erstellenTaschenrechner.
Natürlich ist dies nur eine Zeile, aber wenn wir reale Systeme testen, werden wir oft in die Situation geraten, dass wir mehrere Objekte erstellen und konfigurieren müssen, was mehrere Dutzend Codezeilen erfordern kann. Beispiel:
//Create an HttpClient object
HttpClient client = HttpClient.newBuilder()
.version(Version.HTTP_1_1)
.followRedirects(Redirect.NORMAL)
.connectTimeout(Duration.ofSeconds(20))
.proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)))
.authenticator(Authenticator.getDefault())
.build();
//Create an HttpRequest object
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://codegym.cc"))
.headers("Content-Type", " application/octet-stream")
.POST( HttpRequest.BodyPublishers. ofInputStream ( () -> is; ))
.build();
//Call the send() method
HttpResponse response = client.send(request, BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Im obigen Beispiel haben wir ein Objekt erstellt und konfiguriertHttpClientund möchte die send()- Methode testen .
Damit nicht jedes Mal in der Testmethode die Erstellung eines Objekts geschrieben wirdHttpClient, kann es in eine separate Methode verschoben und mit einer speziellen @BeforeEach- Annotation versehen werden . Dann ruft Junit diese Methode vor jeder Testmethode auf. Beispiel:
class HttpClientTest {
public HttpClient client;
@BeforeEach
public void init(){
client = HttpClient.newBuilder()
.version(Version.HTTP_1_1)
.followRedirects(Redirect.NORMAL)
.connectTimeout(Duration.ofSeconds(20))
.proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)))
.authenticator(Authenticator.getDefault())
.build();
}
@Test
public void send200() throws Exception {
//Create an HttpRequest() object
HttpRequest request = HttpRequest.newBuilder(new URI("https://codegym.cc")).build();
//Call the send() method
HttpResponse response = client.send(request, BodyHandlers.ofString());
assertEquals(200, response.statusCode());
}
@Test
public void send404() throws Exception {
//Create an HttpRequest() object
HttpRequest request = HttpRequest.newBuilder(new URI("https://codegym.cc/unknown")).build();
//Call the send() method
HttpResponse response = client.send(request, BodyHandlers.ofString());
assertEquals(404, response.statusCode());
}
}
Sie können auch eine spezielle Methode erstellen, die jedes Mal nach der nächsten Testmethode aufgerufen wird, und die verwendeten Ressourcen bereinigen , etwas in das Protokoll schreiben usw. Eine solche Methode muss mit der Annotation @AfterEach gekennzeichnet sein .
Wenn Sie über drei Testmethoden test1() , test2() und test3() verfügen , lautet die Aufrufreihenfolge:
- beforeEach-Methode
- test1()
- AfterEach-Methode
- beforeEach-Methode
- test2()
- AfterEach-Methode
- beforeEach-Methode
- test3()
- AfterEach-Methode
3.2 Anmerkungen @BeforeAll, @AfterAll
Mit JUnit können Sie außerdem eine Methode hinzufügen, die einmal vor allen Testmethoden aufgerufen wird . Eine solche Methode sollte mit @BeforeAll annotiert werden . Es verfügt außerdem über eine gepaarte @AfterAll- Annotation . Die damit gekennzeichnete Methode wird von JUnit nach allen Testmethoden aufgerufen.
Lassen Sie uns ein spezielles Beispiel schreiben, mit dem Sie besser verstehen können, wie das Ganze funktioniert. Nehmen wir als Grundlage den Test unseres Rechners:
class CalculatorTest {
private Calculator calc = new Calculator();
@BeforeAll
public static void init(){
System.out.println("BeforeAll init() method called");
}
@BeforeEach
public void initEach(){
System.out.println("BeforeEach initEach() method called");
}
@Test
public void add(){
System.out.println("Testing Addition");
}
@Test
public void sub() {
System.out.println("Testing Subtraction");
}
@Test
public void mul(){
System.out.println("Testing Multiplication");
}
@Test
public void div() {
System.out.println("Testing Division");
}
}
Dieser Test gibt den folgenden Text auf der Konsole aus:
BeforeAll init() method called
BeforeEach initEach() method called
Testing Addition
BeforeEach initEach() method called
Testing Subtraction
BeforeEach initEach() method called
Testing Multiplication
BeforeEach initEach() method called
Testing Division