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