3.1 Анотации @BeforeEach, @AfterEach

Имайте предвид, че в предишния пример във всеки метод трябваше да напишем code, за да създадем обекткалкулатор.

Разбира се, това е само един ред, но ако тестваме реални системи, често ще имаме ситуация, в която трябва да създадем и конфигурираме няколко обекта, което може да отнеме няколко десетки реда code. Пример:

//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());

В горния пример създадохме и конфигурирахме обектHttpClientи искате да тествате метода send() .

Така че всеки път в тестовия метод да не пише създаването на обектHttpClient, той може да бъде преместен в отделен метод и да му бъде дадена специална анотация @BeforeEach . Тогава Junit ще извика този метод преди всеки тестов метод. Пример:

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

Можете също така да създадете специален метод, който ще се извиква всеки път след следващия тестов метод и да почиства използваните ресурси , да записва нещо в дневника и т.н. Такъв метод трябва да бъде маркиран с анотацията @AfterEach .

Ако имате 3 тестови метода test1() , test2() и test3() , тогава редът на повикванията ще бъде:

  • преди всеки метод
  • тест1()
  • Метод AfterEach
  • преди всеки метод
  • тест2()
  • Метод AfterEach
  • преди всеки метод
  • тест3()
  • Метод AfterEach

3.2 Анотации @BeforeAll, @AfterAll

JUnit също ви позволява да добавите метод, който ще бъде извикан веднъж преди всички тестови методи . Такъв метод трябва да бъде анотиран с @BeforeAll . Освен това има сдвоена анотация @AfterAll . Маркираният с него метод ще бъде извикан от JUnit след всички тестови методи.

Нека напишем специален пример, който ви позволява да разберете по-добре How работи всичко. Нека вземем за основа тестването на нашия калкулатор:

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

Този тест ще отпечата следния текст на конзолата:


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