3.1 Chú thích @B BeforeEach, @afterEach

Lưu ý rằng trong ví dụ trước, trong mỗi phương thức, chúng ta phải viết mã để tạo một đối tượngmáy tính.

Tất nhiên, đây chỉ là một dòng, nhưng nếu chúng ta kiểm tra các hệ thống thực, chúng ta sẽ thường gặp tình huống cần tạo và định cấu hình một số đối tượng, có thể mất vài chục dòng mã. Ví dụ:

//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());

Trong ví dụ trên, chúng ta đã tạo và cấu hình một đối tượngHttpClientvà muốn kiểm tra phương thức send() .

Vì vậy, mỗi lần trong phương pháp thử nghiệm không viết việc tạo một đối tượngHttpClient, nó có thể được chuyển sang một phương thức riêng biệt và được cung cấp chú thích @B BeforeEach đặc biệt . Sau đó, Junit sẽ gọi phương thức này trước mỗi phương thức kiểm tra. Ví dụ:

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());
    	}
}

Bạn cũng có thể tạo một phương thức đặc biệt sẽ được gọi mỗi lần sau phương thức thử nghiệm tiếp theo và dọn sạch các tài nguyên đã sử dụng , ghi nội dung nào đó vào nhật ký, v.v. Phương thức như vậy phải được đánh dấu bằng chú thích @AfterEach .

Nếu bạn có 3 phương thức test test1() , test2()test3() thì lệnh gọi sẽ là:

  • phương thức beforeEach
  • kiểm tra1()
  • Phương pháp AfterEach
  • phương thức beforeEach
  • kiểm tra2()
  • Phương pháp AfterEach
  • phương thức beforeEach
  • kiểm tra3()
  • Phương pháp AfterEach

3.2 Chú thích @B BeforeAll, @afterAll

JUnit cũng cho phép bạn thêm một phương thức sẽ được gọi một lần trước tất cả các phương thức kiểm tra . Một phương pháp như vậy phải được chú thích bằng @ BeforeAll . Nó cũng có một chú thích @afterAll được ghép nối . Phương thức được đánh dấu bằng nó sẽ được gọi bởi JUnit sau tất cả các phương thức kiểm tra.

Hãy viết một ví dụ đặc biệt cho phép bạn hiểu rõ hơn về cách thức hoạt động của tất cả. Hãy thử nghiệm máy tính của chúng tôi làm cơ sở:

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");
    }
}

Bài kiểm tra này sẽ in văn bản sau ra bàn điều khiển:


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