3.1 Anteckningar @BeforeEach, @AfterEach

Observera att i föregående exempel, i varje metod var vi tvungna att skriva kod för att skapa ett objektkalkylator.

Naturligtvis är detta bara en rad, men om vi testar riktiga system kommer vi ofta att ha en situation där vi behöver skapa och konfigurera flera objekt, vilket kan ta flera dussin rader kod. Exempel:

//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 exemplet ovan har vi skapat och konfigurerat ett objektHttpClientoch vill testa metoden send() .

Så att varje gång i testmetoden att inte skriva skapandet av ett objektHttpClient, kan den flyttas till en separat metod och ges en speciell @BeforeEach- anteckning . Sedan kommer Junit att anropa denna metod före varje testmetod. Exempel:

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 också skapa en speciell metod som kommer att anropas varje gång efter nästa testmetod, och rensa upp de använda resurserna , skriva något till loggen etc. En sådan metod måste markeras med @ AfterEach -kommentaren .

Om du har tre testmetoder test1() , test2() och test3() , kommer anropsordern att vara:

  • före varje metod
  • test1()
  • Efter varje metod
  • före varje metod
  • test2()
  • Efter varje metod
  • före varje metod
  • test3()
  • Efter varje metod

3.2 Anteckningar @BeforeAll, @AfterAll

JUnit låter dig också lägga till en metod som kommer att anropas en gång före alla testmetoder . En sådan metod bör noteras med @BeforeAll . Den har också en parad @AfterAll- anteckning . Metoden märkt med den kommer att anropas av JUnit efter alla testmetoder.

Låt oss skriva ett speciellt exempel som gör att du bättre kan förstå hur det hela fungerar. Låt oss ta testning av vår kalkylator som grund:

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

Detta test kommer att skriva ut följande text till konsolen:


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