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