3.1 Merknader @BeforeEach, @AfterEach

Merk at i det forrige eksemplet, i hver metode måtte vi skrive kode for å lage et objektkalkulator.

Dette er selvfølgelig bare én linje, men hvis vi tester ekte systemer, vil vi ofte ha en situasjon hvor vi må lage og konfigurere flere objekter, som kan ta flere dusin linjer med kode. Eksempel:

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

I eksemplet ovenfor har vi opprettet og konfigurert et objektHttpClientog ønsker å teste send() -metoden .

Slik at hver gang i testmetoden ikke å skrive opprettelsen av et objektHttpClient, kan den flyttes til en egen metode og gis en spesiell @BeforeEach -kommentar . Deretter vil Junit kalle denne metoden før hver testmetode. Eksempel:

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

Du kan også lage en spesiell metode som kalles opp hver gang etter neste testmetode, og rydde opp i de brukte ressursene , skrive noe til loggen osv. En slik metode må merkes med @AfterEach -kommentaren .

Hvis du har 3 testmetoder test1() , test2() og test3() , vil anropsrekkefølgen være:

  • før hver metode
  • test1()
  • Etter hver metode
  • før hver metode
  • test2()
  • Etter hver metode
  • før hver metode
  • test3()
  • Etter hver metode

3.2 Merknader @BeforeAll, @AfterAll

JUnit lar deg også legge til en metode som vil bli kalt én gang før alle testmetoder . En slik metode bør merkes med @BeforeAll . Den har også en sammenkoblet @AfterAll- kommentar . Metoden merket med den vil bli kalt av JUnit etter alle testmetoder.

La oss skrive et spesielt eksempel som lar deg bedre forstå hvordan det hele fungerer. La oss ta testing av kalkulatoren vår som grunnlag:

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

Denne testen vil skrive ut følgende tekst til konsollen:


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