3.1 Mga Anotasyon @BeforeEach, @AfterEach

Tandaan na sa nakaraang halimbawa, sa bawat pamamaraan kailangan naming magsulat ng code upang lumikha ng isang bagaycalculator.

Siyempre, ito ay isang linya lamang, ngunit kung susuriin natin ang mga totoong system, madalas tayong magkakaroon ng sitwasyon kung saan kailangan nating gumawa at mag-configure ng ilang bagay, na maaaring tumagal ng ilang dosenang linya ng code. Halimbawa:

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

Sa halimbawa sa itaas, gumawa at nag-configure kami ng isang bagayHttpClientat gustong subukan ang send() method .

Kaya na sa bawat oras sa pagsubok na paraan hindi upang isulat ang paglikha ng isang bagayHttpClient, maaari itong ilipat sa isang hiwalay na paraan at bigyan ng espesyal na @BeforeEach annotation . Pagkatapos ay tatawagin ni Junit ang pamamaraang ito bago ang bawat pamamaraan ng pagsubok. Halimbawa:

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

Maaari ka ring lumikha ng isang espesyal na paraan na tatawagin sa bawat oras pagkatapos ng susunod na paraan ng pagsubok, at linisin ang mga ginamit na mapagkukunan , magsulat ng isang bagay sa log, atbp. Ang ganitong paraan ay dapat na minarkahan ng @AfterEach annotation .

Kung mayroon kang 3 paraan ng pagsubok test1() , test2() at test3() , ang order ng tawag ay:

  • bago ang bawat pamamaraan
  • pagsubok1()
  • Pagkatapos ng bawat pamamaraan
  • bago ang bawat pamamaraan
  • pagsubok2()
  • Pagkatapos ng bawat pamamaraan
  • bago ang bawat pamamaraan
  • pagsubok3()
  • Pagkatapos ng bawat pamamaraan

3.2 Anotasyon @BeforeAll, @AfterAll

Pinapayagan ka rin ng JUnit na magdagdag ng isang paraan na tatawagin nang isang beses bago ang lahat ng mga pamamaraan ng pagsubok . Ang ganitong paraan ay dapat i-annotate sa @BeforeAll . Mayroon din itong ipinares na @AfterAll annotation . Ang pamamaraang minarkahan nito ay tatawagin ng JUnit pagkatapos ng lahat ng mga pamamaraan ng pagsubok.

Sumulat tayo ng isang espesyal na halimbawa na nagbibigay-daan sa iyong mas maunawaan kung paano gumagana ang lahat. Kunin natin ang pagsubok sa ating calculator bilang batayan:

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

Ipi-print ng pagsubok na ito ang sumusunod na text sa console:


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