วันเสาร์ที่ 20 มิถุนายน พ.ศ. 2558

Spring Boot ตอนที่ 8 Testing

ต่อไปมาดูว่าเราจะเทสกันยังไงครับ ถ้าเป็น Unit Testing ไม่ใช่ส่วนของ Controller กับ Repository น่าจะเเขียนเทสได้เลยโดยไม่ต้องพึ่ง Spring-Test สกับพวก Integration Testing ก็ต้องใช้ Spring-Test ล่ะครับ
เรามาดูกัน
1. Config POM
 <dependency>  
      <groupId>org.springframework.boot</groupId>  
      <artifactId>spring-boot-starter-test</artifactId>  
      <scope>test</scope>  
 </dependency>  
     โดยมันจะดึง Library Spring Test, JUnit, Hamcrest, Mockito มาให้เลยครับ

2. ถาจะทำเทสจะต้องมี embedded server มาด้วยนะครับ เพราะถ้าเขียนลง Server จะ exclude ออก ถ้าจะเทสจะเอาเข้ามาแล้วใช้ Scope = test เอาครับ แบบนี้
 <dependency>  
      <groupId>org.springframework.boot</groupId>  
      <artifactId>spring-boot-starter-tomcat</artifactId>  
      <scope>provided</scope>  
 </dependency>  

3. มาดู Class Test
 package tutorialspring4.controllers;  
 import static org.hamcrest.Matchers.is;  
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;  
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;  
 import org.junit.Before;  
 import org.junit.Ignore;  
 import org.junit.Test;  
 import org.junit.runner.RunWith;  
 import org.springframework.boot.test.SpringApplicationConfiguration;  
 import org.springframework.http.MediaType;  
 import org.springframework.mock.web.MockServletContext;  
 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.request.MockMvcRequestBuilders;  
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;  
 import tutorial.spring4.controllers.HelloController;  
 import tutorial.spring4.forms.HelloForm;  
 @RunWith(SpringJUnit4ClassRunner.class)  
 @SpringApplicationConfiguration(classes = MockServletContext.class)  
 @WebAppConfiguration  
 public class HelloControllerTest {  
      private MockMvc mvc;  
      @Before  
      public void setUp() throws Exception {  
           mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();  
      }  
      @Test  
      public void getHello() throws Exception {  
           HelloForm form = new HelloForm();  
           form.setSay("Hi");  
           form.setName("Hello");  
           mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk())  
           .andExpect(jsonPath("$.say", is(form.getSay()))).andExpect(jsonPath("$.name", is(form.getName())));  
      }  
 }  
     - RunWith = SpringJUnit4ClassRunner บอก JUnit ว่าจะใช้ Spring Test
     - SpringApplicationConfiguration = MockServletContext บอก Spring ว่าจะใช้ Mock ส่วนของ servlet
     - MockMvc จะ Mock ส่วนของ Controller เพื่อเทส จะเห็นว่าตอน SetUp จะมีการ Build อยู่
     - ส่วนเทสจะเห็นว่าเทสไปที่ Path เลยไม่ได้เทส จาก Controller ทำให้เทส route ว่าถูกไหม ทำงานโอเคไหมครับ

References
Basic
1. Spring Boot ตอนที่ 1 มาทำความรู้จักกับ Spring Boot
2. Spring Boot ตอนที่ 2 Hello World
3. Spring Boot ตอนที่ 3 โครงสร้างของ Project
4. Spring Boot ตอนที่ 4 Spring Boot กับ Thymeleaf
5.Spring Boot ตอนที่ 5 Spring Boot กับ Database [แบบ Embeded]
6.Spring Boot ตอนที่ 6 กับ Production Database
7.Spring Boot ตอนที่ 7 Security
8.Spring Boot ตอนที่ 8 Testing