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
GO TO FULL VERSION