Spring Boot - Dinlenme Kontrol Cihazı Birimi Testi

Spring Boot, Dinlenme Denetleyicisi için Birim Testi dosyası yazmak için kolay bir yol sağlar. SpringJUnit4ClassRunner ve MockMvc yardımıyla, Unit Test for Rest Controller dosyası yazmak için bir web uygulaması bağlamı oluşturabiliriz.

Birim Testleri yazılmalıdır. src/test/java Bir test yazmak için dizin ve sınıf yolu kaynakları, src/test/resources dizin.

Bir Birim Testi Yazmak için, aşağıda gösterildiği gibi yapı yapılandırma dosyanıza Spring Boot Starter Test bağımlılığını eklememiz gerekir.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
   <scope>test</scope>
</dependency>

Gradle kullanıcıları, build.gradle dosyanıza aşağıdaki bağımlılığı ekleyebilir.

testCompile('org.springframework.boot:spring-boot-starter-test')

Bir Test senaryosu yazmadan önce, ilk olarak RESTful web hizmetleri oluşturmalıyız. RESTful web hizmetleri oluşturma hakkında daha fazla bilgi için, lütfen bu eğitimde verilenle ilgili bölüme bakın.

REST Denetleyicisi için Birim Testi Yazma

Bu bölümde REST Denetleyicisi için nasıl Birim Testi yazacağımızı görelim.

İlk olarak, MockMvc kullanarak web uygulaması bağlamı oluşturmak için kullanılan Abstract sınıf dosyası oluşturmamız ve Java nesnesini JSON dizesine dönüştürmek ve JSON dizesini Java nesnesine dönüştürmek için mapToJson () ve mapFromJson () yöntemlerini tanımlamamız gerekir.

package com.tutorialspoint.demo;

import java.io.IOException;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = DemoApplication.class)
@WebAppConfiguration
public abstract class AbstractTest {
   protected MockMvc mvc;
   @Autowired
   WebApplicationContext webApplicationContext;

   protected void setUp() {
      mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
   }
   protected String mapToJson(Object obj) throws JsonProcessingException {
      ObjectMapper objectMapper = new ObjectMapper();
      return objectMapper.writeValueAsString(obj);
   }
   protected <T> T mapFromJson(String json, Class<T> clazz)
      throws JsonParseException, JsonMappingException, IOException {
      
      ObjectMapper objectMapper = new ObjectMapper();
      return objectMapper.readValue(json, clazz);
   }
}

Ardından, AbstractTest sınıfını genişleten bir sınıf dosyası yazın ve GET, POST, PUT ve DELETE gibi her yöntem için bir Birim Testi yazın.

GET API Test senaryosu kodu aşağıda verilmiştir. Bu API, ürünlerin listesini görüntülemek içindir.

@Test
public void getProductsList() throws Exception {
   String uri = "/products";
   MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.get(uri)
      .accept(MediaType.APPLICATION_JSON_VALUE)).andReturn();
   
   int status = mvcResult.getResponse().getStatus();
   assertEquals(200, status);
   String content = mvcResult.getResponse().getContentAsString();
   Product[] productlist = super.mapFromJson(content, Product[].class);
   assertTrue(productlist.length > 0);
}

POST API test durumu kodu aşağıda verilmiştir. Bu API, bir ürün oluşturmak içindir.

@Test
public void createProduct() throws Exception {
   String uri = "/products";
   Product product = new Product();
   product.setId("3");
   product.setName("Ginger");
   
   String inputJson = super.mapToJson(product);
   MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.post(uri)
      .contentType(MediaType.APPLICATION_JSON_VALUE).content(inputJson)).andReturn();
   
   int status = mvcResult.getResponse().getStatus();
   assertEquals(201, status);
   String content = mvcResult.getResponse().getContentAsString();
   assertEquals(content, "Product is created successfully");
}

PUT API Testi durumu için kod aşağıda verilmiştir. Bu API, mevcut ürünü güncellemektir.

@Test
public void updateProduct() throws Exception {
   String uri = "/products/2";
   Product product = new Product();
   product.setName("Lemon");
   
   String inputJson = super.mapToJson(product);
   MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.put(uri)
      .contentType(MediaType.APPLICATION_JSON_VALUE).content(inputJson)).andReturn();
   
   int status = mvcResult.getResponse().getStatus();
   assertEquals(200, status);
   String content = mvcResult.getResponse().getContentAsString();
   assertEquals(content, "Product is updated successsfully");
}

API Testini Silme durumu kodu aşağıda verilmiştir. Bu API, mevcut ürünü silecektir.

@Test
public void deleteProduct() throws Exception {
   String uri = "/products/2";
   MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.delete(uri)).andReturn();
   int status = mvcResult.getResponse().getStatus();
   assertEquals(200, status);
   String content = mvcResult.getResponse().getContentAsString();
   assertEquals(content, "Product is deleted successsfully");
}

Tam Denetleyici Test sınıfı dosyası aşağıda verilmiştir -

package com.tutorialspoint.demo;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import org.junit.Before;
import org.junit.Test;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;

import com.tutorialspoint.demo.model.Product;

public class ProductServiceControllerTest extends AbstractTest {
   @Override
   @Before
   public void setUp() {
      super.setUp();
   }
   @Test
   public void getProductsList() throws Exception {
      String uri = "/products";
      MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.get(uri)
         .accept(MediaType.APPLICATION_JSON_VALUE)).andReturn();
      
      int status = mvcResult.getResponse().getStatus();
      assertEquals(200, status);
      String content = mvcResult.getResponse().getContentAsString();
      Product[] productlist = super.mapFromJson(content, Product[].class);
      assertTrue(productlist.length > 0);
   }
   @Test
   public void createProduct() throws Exception {
      String uri = "/products";
      Product product = new Product();
      product.setId("3");
      product.setName("Ginger");
      String inputJson = super.mapToJson(product);
      MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.post(uri)
         .contentType(MediaType.APPLICATION_JSON_VALUE)
         .content(inputJson)).andReturn();
      
      int status = mvcResult.getResponse().getStatus();
      assertEquals(201, status);
      String content = mvcResult.getResponse().getContentAsString();
      assertEquals(content, "Product is created successfully");
   }
   @Test
   public void updateProduct() throws Exception {
      String uri = "/products/2";
      Product product = new Product();
      product.setName("Lemon");
      String inputJson = super.mapToJson(product);
      MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.put(uri)
         .contentType(MediaType.APPLICATION_JSON_VALUE)
         .content(inputJson)).andReturn();
      
      int status = mvcResult.getResponse().getStatus();
      assertEquals(200, status);
      String content = mvcResult.getResponse().getContentAsString();
      assertEquals(content, "Product is updated successsfully");
   }
   @Test
   public void deleteProduct() throws Exception {
      String uri = "/products/2";
      MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.delete(uri)).andReturn();
      int status = mvcResult.getResponse().getStatus();
      assertEquals(200, status);
      String content = mvcResult.getResponse().getContentAsString();
      assertEquals(content, "Product is deleted successsfully");
   }
}

Yürütülebilir bir JAR dosyası oluşturabilir ve aşağıda verilen Maven veya Gradle komutlarını kullanarak Spring Boot uygulamasını çalıştırabilirsiniz -

Maven için aşağıda verilen komutu kullanabilirsiniz -

mvn clean install

Artık test sonuçlarını konsol penceresinde görebilirsiniz.

Gradle için, aşağıda gösterildiği gibi komutu kullanabilirsiniz -

gradle clean build

Kalan sonuçları aşağıda gösterildiği gibi konsol penceresinde görebilirsiniz.