3.1 @BeforeEach, @AfterEach annotatsiyalar
Oldingi misolda har bir metodda Calculator obyektini yaratish uchun kod yozishimiz kerak edi.
Bu faqat bir qator, lekin haqiqiy tizimlarni test qilsak, ko'pincha bir necha obyektni yaratish va sozlash kerak bo'ladi, bu esa bir necha o'n qator kodni egallashi mumkin. Misol:
//HttpClient obyektini yaratamiz
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();
//HttpRequest obyektini yaratamiz
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://javarush.com"))
.headers("Content-Type", " application/octet-stream")
.POST( HttpRequest.BodyPublishers. ofInputStream ( () -> is; ))
.build();
//send() metodini chaqiramiz
HttpResponse
response = client.send(request, BodyHandlers.ofString()); System.out.println(response.statusCode()); System.out.println(response.body());
Yuqoridagi misolda biz HttpClient obyektini yaratdik va send() metodini test qilmoqchimiz.
Har safar test metodida HttpClient obyektini yaratishni yozmaslik uchun uni alohida metodga ajratib, maxsus annotatsiyaga @BeforeEach belgilashimiz mumkin. Junit bu metodni har bir test metodidan oldin chaqiradi. Misol:
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 {
//HttpRequst() obyektini yaratamiz
HttpRequest request = HttpRequest.newBuilder(new URI("https://javarush.com")).build();
//send() metodini chaqiramiz
HttpResponse
response = client.send(request, BodyHandlers.ofString()); assertEquals(200, response.statusCode()); } @Test public void send404() throws Exception { //HttpRequst() obyektini yaratamiz HttpRequest request = HttpRequest.newBuilder(new URI("https://javarush.com/unknown")).build(); //send() metodini chaqiramiz HttpResponse
response = client.send(request, BodyHandlers.ofString()); assertEquals(404, response.statusCode()); } }
Bundan tashqari, har bir test metodidan keyin chaqiriladigan maxsus metod yaratish mumkin va foydalanilgan resurslarni tozalash, logga yozish va hokazo. Bunday metodni @AfterEach annotatsiyasi bilan belgilash kerak.
Agar sizda 3 ta test metodlari test1(), test2() va test3() bo'lsa, chaqirilish tartibi quyidagicha bo'ladi:
- BeforeEach-metod
- test1()
- AfterEach-metod
- BeforeEach-metod
- test2()
- AfterEach-metod
- BeforeEach-metod
- test3()
- AfterEach-metod
3.2 @BeforeAll, @AfterAll annotatsiyalar
JUnit test metodlaridan oldin bir marta chaqiriladigan metod qo'shishga imkon beradi. Bunday metodni @BeforeAll annotatsiyasi bilan belgilash kerak. Uning uchun @AfterAll parallel annotatsiyasi mavjud. Bu bilan belgilangan metod test metodlaridan keyin JUnit tomonidan chaqiriladi.
Buning qanday ishlashini yaxshiroq tushunish uchun maxsus misol yozamiz. Calculator'imizni test qilishni asos qilib olamiz:
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("Qo'shish test qilinmoqda");
}
@Test
public void sub() {
System.out.println("Ayirma test qilinmoqda");
}
@Test
public void mul(){
System.out.println("Ko'paytirish test qilinmoqda");
}
@Test
public void div() {
System.out.println("Bo'lish test qilinmoqda");
}
}
Bu test konsolda quyidagi matnni chop etadi:
BeforeAll init() method called
BeforeEach initEach() method called
Qo'shish test qilinmoqda
BeforeEach initEach() method called
Ayirma test qilinmoqda
BeforeEach initEach() method called
Ko'paytirish test qilinmoqda
BeforeEach initEach() method called
Bo'lish test qilinmoqda
GO TO FULL VERSION