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