3.1 Adnotacje @BeforeEach, @AfterEach
Zauważ, że w poprzednim przykładzie w każdej metodzie musieliśmy napisać kod, aby utworzyć obiektkalkulator.
Oczywiście to tylko jedna linijka, ale jeśli testujemy prawdziwe systemy, często będziemy mieli sytuację, w której trzeba stworzyć i skonfigurować kilka obiektów, co może zająć kilkadziesiąt linijek kodu. Przykład:
//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());
W powyższym przykładzie stworzyliśmy i skonfigurowaliśmy obiektHttpClienti chcesz przetestować metodę send() .
Aby za każdym razem w metodzie testowej nie pisać tworzenia obiektuHttpClient, można ją przenieść do osobnej metody i nadać jej specjalną adnotację @BeforeEach . Następnie Junit wywoła tę metodę przed każdą metodą testową. Przykład:
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());
}
}
Można też stworzyć specjalną metodę, która będzie wywoływana każdorazowo po kolejnej metodzie testowej, a także wyczyścić wykorzystane zasoby , wpisać coś do logu itp. Taka metoda musi być oznaczona adnotacją @AfterEach .
Jeśli masz 3 metody testowe test1() , test2() i test3() , to kolejność połączeń będzie następująca:
- przed każdą metodą
- test1()
- Metoda AfterEach
- przed każdą metodą
- test2()
- Metoda AfterEach
- przed każdą metodą
- test3()
- Metoda AfterEach
3.2 Adnotacje @BeforeAll, @AfterAll
JUnit pozwala również dodać metodę, która zostanie wywołana raz przed wszystkimi metodami testowymi . Taka metoda powinna być opatrzona adnotacją @BeforeAll . Ma również sparowaną adnotację @AfterAll . Metoda oznaczona nim zostanie wywołana przez JUnit po wszystkich metodach testowych.
Napiszmy specjalny przykład, który pozwoli ci lepiej zrozumieć, jak to wszystko działa. Weźmy jako podstawę testowanie naszego kalkulatora:
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");
}
}
Ten test spowoduje wydrukowanie następującego tekstu w konsoli:
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