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()ลำดับการโทรจะเป็น:
- ก่อนแต่ละวิธี
- ทดสอบ 1()
- AfterEach วิธี
- ก่อนแต่ละวิธี
- ทดสอบ 2()
- AfterEach วิธี
- ก่อนแต่ละวิธี
- ทดสอบ 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