3.1 註解@BeforeEach、@AfterEach
請注意,在前面的示例中,我們必須在每個方法中編寫代碼來創建一個對象計算器.
當然這只是一行,但是如果我們測試真實的系統,經常會出現需要創建和配置幾個對象的情況,這可能需要幾十行代碼。例子:
//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());
在上面的示例中,我們創建並配置了一個對象HTTP客戶端並想測試send()方法。
這樣每次在測試方法中就不用寫對象的創建HTTP客戶端,它可以被移動到一個單獨的方法並給予一個特殊的@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(),那麼調用順序將是:
- beforeEach 方法
- 測試1()
- AfterEach 方法
- beforeEach 方法
- 測試2()
- AfterEach 方法
- beforeEach 方法
- 測試 3()
- AfterEach 方法
3.2 註解@BeforeAll、@AfterAll
JUnit 還允許您添加一個將在所有測試方法之前調用一次的方法。這樣的方法應該用@BeforeAll註釋。它還具有成對的@AfterAll註釋。標有它的方法將在所有測試方法之後由 JUnit 調用。
讓我們寫一個特殊的例子,讓你更好地理解它是如何工作的。讓我們以測試我們的計算器為基礎:
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