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