3.1 Adnotacje @BeforeEach, @AfterEach

Zauważ, że w poprzednim przykładzie w każdej metodzie musieliśmy napisać kod, aby utworzyć obiektkalkulator.

Oczywiście to tylko jedna linijka, ale jeśli testujemy prawdziwe systemy, często będziemy mieli sytuację, w której trzeba stworzyć i skonfigurować kilka obiektów, co może zająć kilkadziesiąt linijek kodu. Przykład:


   //Utwórz obiekt HttpClient
   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();
 
   //Utwórz obiekt HttpRequest
  HttpRequest request = HttpRequest.newBuilder()
     .uri(new URI("https://codegym.cc"))
     .headers("Content-Type", " application/octet-stream")
     .POST( HttpRequest.BodyPublishers. ofInputStream ( () -> is; ))
     .build();
 
   //Wywołaj metodę send().
   HttpResponse response = client.send(request, BodyHandlers.ofString());
   System.out.println(response.statusCode());
   System.out.println(response.body());

W powyższym przykładzie stworzyliśmy i skonfigurowaliśmy obiektHttpClienti chcesz przetestować metodę send() .

Aby za każdym razem w metodzie testowej nie pisać tworzenia obiektuHttpClient, można ją przenieść do osobnej metody i nadać jej specjalną adnotację @BeforeEach . Następnie Junit wywoła tę metodę przed każdą metodą testową. Przykład:


    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 {
     	   //Utwórz obiekt HttpRequest().
         	HttpRequest request = HttpRequest.newBuilder(new URI("https://codegym.cc")).build();
 
     	   //Wywołaj metodę send().
     	   HttpResponse response = client.send(request, BodyHandlers.ofString());
        	assertEquals(200, response.statusCode());
        }

   	@Test
    	public void send404() throws Exception {
     	   //Utwórz obiekt HttpRequest().
         	HttpRequest request = HttpRequest.newBuilder(new URI("https://codegym.cc/unknown")).build();

     	   //Wywołaj metodę send().
     	   HttpResponse response = client.send(request, BodyHandlers.ofString());
        	assertEquals(404, response.statusCode());
    	}
}

Można też stworzyć specjalną metodę, która będzie wywoływana każdorazowo po kolejnej metodzie testowej, a także wyczyścić wykorzystane zasoby , wpisać coś do logu itp. Taka metoda musi być oznaczona adnotacją @AfterEach .

Jeśli masz 3 metody testowe test1() , test2() i test3() , to kolejność połączeń będzie następująca:

  • przed każdą metodą
  • test1()
  • Metoda AfterEach
  • przed każdą metodą
  • test2()
  • Metoda AfterEach
  • przed każdą metodą
  • test3()
  • Metoda AfterEach

3.2 Adnotacje @BeforeAll, @AfterAll

JUnit pozwala również dodać metodę, która zostanie wywołana raz przed wszystkimi metodami testowymi . Taka metoda powinna być opatrzona adnotacją @BeforeAll . Ma również sparowaną adnotację @AfterAll . Metoda oznaczona nim zostanie wywołana przez JUnit po wszystkich metodach testowych.

Napiszmy specjalny przykład, który pozwoli ci lepiej zrozumieć, jak to wszystko działa. Weźmy jako podstawę testowanie naszego kalkulatora:


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");
    }
}

Ten test spowoduje wydrukowanie następującego tekstu w konsoli:


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