3.1 Annotációk @BeforeEach, @AfterEach

Vegye figyelembe, hogy az előző példában minden metódusban kódot kellett írnunk egy objektum létrehozásáhozszámológép.

Természetesen ez csak egy sor, de ha valódi rendszereket tesztelünk, gyakran lesz olyan helyzetünk, amikor több objektumot kell létrehoznunk és konfigurálnunk, ami több tucat sornyi kódot is igénybe vehet. Példa:

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

A fenti példában létrehoztunk és konfiguráltunk egy objektumotHttpClientés szeretné tesztelni a send() metódust .

Annak érdekében, hogy minden alkalommal a vizsgálati módszerben ne írjon egy objektum létrehozásátHttpClient, áthelyezhető egy külön metódusba, és külön @BeforeEach megjegyzést kaphat . Ekkor a Junit minden vizsgálati módszer előtt meghívja ezt a módszert. Példa:

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

Létrehozhat egy speciális metódust is, amely minden alkalommal meghívódik a következő tesztmetódus után, és megtisztítja a felhasznált erőforrásokat , írhat valamit a naplóba stb. Az ilyen metódusokat meg kell jelölni az @AfterEach annotációval .

Ha 3 tesztmódszerrel rendelkezik test1() , test2() és test3() , akkor a hívási sorrend a következő lesz:

  • Minden módszer előtt
  • teszt1()
  • Minden módszer után
  • Minden módszer előtt
  • teszt2()
  • Minden módszer után
  • Minden módszer előtt
  • teszt3()
  • Minden módszer után

3.2 Annotációk @Minden előtt, @AfterAll

A JUnit lehetővé teszi egy olyan módszer hozzáadását is, amely az összes tesztmódszer előtt egyszer kerül meghívásra . Az ilyen metódust @BeforeAll megjegyzéssel kell ellátni . Páros @AfterAll annotációval is rendelkezik . A vele jelölt módszert a JUnit minden vizsgálati módszer után meghívja.

Írjunk egy speciális példát, amely lehetővé teszi, hogy jobban megértse, hogyan működik az egész. Vegyük a kalkulátorunk tesztelését alapul:

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

Ez a teszt a következő szöveget nyomtatja ki a konzolra:


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