3.1 Adnotări @BeforeEach, @AfterEach

Rețineți că în exemplul anterior, în fiecare metodă a trebuit să scriem cod pentru a crea un obiectcalculator.

Desigur, aceasta este doar o linie, dar dacă testăm sisteme reale, vom avea adesea o situație în care trebuie să creăm și să configuram mai multe obiecte, care pot lua câteva zeci de linii de cod. Exemplu:

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

În exemplul de mai sus, am creat și configurat un obiectHttpClientși doriți să testați metoda send() .

Astfel încât de fiecare dată în metoda de testare să nu scrie creația unui obiectHttpClient, poate fi mutat într-o metodă separată și poate fi dat o adnotare specială @BeforeEach . Apoi Junit va apela această metodă înainte de fiecare metodă de testare. Exemplu:

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

De asemenea, puteți crea o metodă specială care va fi apelată de fiecare dată după următoarea metodă de testare și curățați resursele utilizate , scrieți ceva în jurnal etc. O astfel de metodă trebuie să fie marcată cu adnotarea @AfterEach .

Dacă aveți 3 metode de testare test1() , test2() și test3() , atunci ordinea apelurilor va fi:

  • înainteFiecare metodă
  • test1()
  • După fiecare metodă
  • înainteFiecare metodă
  • test2()
  • După fiecare metodă
  • înainteFiecare metodă
  • test3()
  • După fiecare metodă

3.2 Adnotări @BeforeAll, @AfterAll

JUnit vă permite, de asemenea, să adăugați o metodă care va fi apelată o dată înaintea tuturor metodelor de testare . O astfel de metodă ar trebui adnotată cu @BeforeAll . Are, de asemenea, o adnotare @AfterAll asociată . Metoda marcată cu aceasta va fi apelată de JUnit după toate metodele de testare.

Să scriem un exemplu special care vă permite să înțelegeți mai bine cum funcționează totul. Să luăm ca bază testarea calculatorului nostru:

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

Acest test va imprima următorul text pe consolă:


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