3.1 Anotasi @BeforeEach, @AfterEach

Perhatikan bahwa pada contoh sebelumnya, di setiap metode kita harus menulis kode untuk membuat objekKalkulator.

Tentu saja, ini hanya satu baris, tetapi jika kita menguji sistem nyata, kita akan sering mengalami situasi di mana kita perlu membuat dan mengonfigurasi beberapa objek, yang dapat memerlukan beberapa lusin baris kode. Contoh:

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

Pada contoh di atas, kita telah membuat dan mengonfigurasi sebuah objekHttpClientdan ingin menguji metode send() .

Sehingga setiap kali dalam metode pengujian tidak menulis pembuatan objekHttpClient, dapat dipindahkan ke metode terpisah dan diberi anotasi @BeforeEach khusus . Kemudian Junit akan memanggil metode ini sebelum setiap metode pengujian. Contoh:

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

Anda juga dapat membuat metode khusus yang akan dipanggil setiap kali setelah metode pengujian berikutnya, dan membersihkan sumber daya yang digunakan , menulis sesuatu ke log, dll. Metode tersebut harus ditandai dengan anotasi @AfterEach .

Jika Anda memiliki 3 metode pengujian test1() , test2() dan test3() , maka urutan panggilannya adalah:

  • sebelum Setiap metode
  • tes1()
  • Metode AfterEach
  • sebelum Setiap metode
  • tes2()
  • Metode AfterEach
  • sebelum Setiap metode
  • uji3()
  • Metode AfterEach

3.2 Anotasi @BeforeAll, @AfterAll

JUnit juga memungkinkan Anda menambahkan metode yang akan dipanggil sekali sebelum semua metode pengujian . Metode seperti itu harus dijelaskan dengan @BeforeAll . Ini juga memiliki anotasi @AfterAll berpasangan . Metode yang ditandai dengan itu akan dipanggil oleh JUnit setelah semua metode pengujian.

Mari tulis contoh khusus yang memungkinkan Anda untuk lebih memahami cara kerjanya. Mari kita uji kalkulator kita sebagai dasar:

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

Tes ini akan mencetak teks berikut ke konsol:


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