3.1 Анотации @BeforeEach, @AfterEach
Имайте предвид, че в предишния пример във всеки метод трябваше да напишем code, за да създадем обекткалкулатор.
Разбира се, това е само един ред, но ако тестваме реални системи, често ще имаме ситуация, в която трябва да създадем и конфигурираме няколко обекта, което може да отнеме няколко десетки реда code. Пример:
//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());
В горния пример създадохме и конфигурирахме обектHttpClientи искате да тествате метода send() .
Така че всеки път в тестовия метод да не пише създаването на обектHttpClient, той може да бъде преместен в отделен метод и да му бъде дадена специална анотация @BeforeEach . Тогава Junit ще извика този метод преди всеки тестов метод. Пример:
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());
}
}
Можете също така да създадете специален метод, който ще се извиква всеки път след следващия тестов метод и да почиства използваните ресурси , да записва нещо в дневника и т.н. Такъв метод трябва да бъде маркиран с анотацията @AfterEach .
Ако имате 3 тестови метода test1() , test2() и test3() , тогава редът на повикванията ще бъде:
- преди всеки метод
- тест1()
- Метод AfterEach
- преди всеки метод
- тест2()
- Метод AfterEach
- преди всеки метод
- тест3()
- Метод AfterEach
3.2 Анотации @BeforeAll, @AfterAll
JUnit също ви позволява да добавите метод, който ще бъде извикан веднъж преди всички тестови методи . Такъв метод трябва да бъде анотиран с @BeforeAll . Освен това има сдвоена анотация @AfterAll . Маркираният с него метод ще бъде извикан от JUnit след всички тестови методи.
Нека напишем специален пример, който ви позволява да разберете по-добре How работи всичко. Нека вземем за основа тестването на нашия калкулатор:
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");
}
}
Този тест ще отпечата следния текст на конзолата:
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