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