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