CodeGym /Corsi /All lectures for IT purposes /Impostazione di un ambiente di test in JUnit

Impostazione di un ambiente di test in JUnit

All lectures for IT purposes
Livello 1 , Lezione 317
Disponibile

3.1 Annotazioni @BeforeEach, @AfterEach

Si noti che nell'esempio precedente, in ciascun metodo è stato necessario scrivere codice per creare un oggettocalcolatrice.

Ovviamente questa è solo una riga, ma se testiamo sistemi reali, spesso avremo una situazione in cui dobbiamo creare e configurare diversi oggetti, che possono richiedere diverse dozzine di righe di codice. Esempio:

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

Nell'esempio sopra, abbiamo creato e configurato un oggettoHttpCliente voglio testare il metodo send() .

In modo che ogni volta nel metodo di prova non scriva la creazione di un oggettoHttpClient, può essere spostato in un metodo separato e dotato di una speciale annotazione @BeforeEach . Quindi Junit chiamerà questo metodo prima di ogni metodo di test. Esempio:

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

Puoi anche creare un metodo speciale che verrà chiamato ogni volta dopo il prossimo metodo di test e ripulire le risorse utilizzate , scrivere qualcosa nel registro, ecc. Tale metodo deve essere contrassegnato con l' annotazione @AfterEach .

Se hai 3 metodi di test test1() , test2() e test3() , l'ordine di chiamata sarà:

  • prima di ogni metodo
  • prova1()
  • Dopo ogni metodo
  • prima di ogni metodo
  • prova2()
  • Dopo ogni metodo
  • prima di ogni metodo
  • prova3()
  • Dopo ogni metodo

3.2 Annotazioni @BeforeAll, @AfterAll

JUnit consente inoltre di aggiungere un metodo che verrà chiamato una volta prima di tutti i metodi di test . Tale metodo dovrebbe essere annotato con @BeforeAll . Ha anche un'annotazione @AfterAll accoppiata . Il metodo contrassegnato con esso verrà chiamato da JUnit dopo tutti i metodi di test.

Scriviamo un esempio speciale che ti permetta di capire meglio come funziona il tutto. Prendiamo come base il test della nostra calcolatrice:

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

Questo test stamperà il seguente testo sulla console:


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
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION