Springboot---Controller單元測試
阿新 • • 發佈:2018-12-10
知識準備
1、註解含義
@RunWith(SpringRunner.class):表示使用Spring Test元件進行單元測試,其中SpringRunner繼承類SpringJUnit4ClassRunner。 @WebAppConfiguration:測試環境使用,用來表示測試環境使用的ApplicationContext將是WebApplicationContext型別的;value指定web應用的根; @AutoConfigureMockMvc:注入一個MockMvc例項;
注入web環境的ApplicationContext容器:mvc = MockMvcBuilders.webAppContextSetup(context).build();
//方式一: /** * 自定義jason轉換欄位過路規則 */ ValueFilter filter = new ValueFilter() { @Override public Object process(Object object, String name, Object value) { if (value == null) return "";//如果欄位的值為空則用空字串代替 return value; } }; JSONObject.toJSONString(lisList,filter ) // 方式二: // 如果lisList欄位的值為空,則用null表示 JSONObject.toJSONString(lisList,SerializerFeature.WriteMapNullValue)
單元測試
依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
程式碼
2、使用ObjectMapper等同於對Girl物件直接賦值再轉換為json格式。
@RunWith(SpringRunner.class) @SpringBootTest// 此處若不指定,則預設為src/main/java/下面的啟動類 public class TermControllerTest { private MockMvc mockMvc; private static final String PREFIX_URI = "XXXXXXX"; /** * 注入WebApplicationContext */ @Autowired private WebApplicationContext webApplicationContext; /** * 模擬MVC物件,通過MockMvcBuilders.webAppContextSetup(this.webApplicationContext).build()初始化 */ @Before public void setup() { this.mockMvc = MockMvcBuilders.webAppContextSetup( this.webApplicationContext).build(); } /** * 獲取所有字典類別,型別為basicitems * * @throws Exception */ @Test public void loadTermsByTypes() throws Exception { String uri = PREFIX_URI + "/basic/getList" + "?types=changestatus"; // 構造返回值物件 Response<List<List<Map<String, String>>>> fpoResponse = new FpoResponse<>(); Response.setCode("xxx"); ... ... // 模擬GET請求 MvcResult mvcResult = this.mockMvc .perform(MockMvcRequestBuilders.get(uri)) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(// 校驗自定義的狀態碼 MockMvcResultMatchers.jsonPath("$.code").value( "xxxxxxx")) .andExpect( MockMvcResultMatchers.content().contentType( MediaType.APPLICATION_JSON_UTF8)) .andExpect( MockMvcResultMatchers.jsonPath("$.result").value(// 獲取所有結果 JSONObject.toJSONString(lisList,// 指定空字串也進行轉換 SerializerFeature.WriteMapNullValue))) .andReturn();// 獲取返回結果 /** * 自定義jason轉換欄位過路規則 */ ValueFilter filter = new ValueFilter() { @Override public Object process(Object object, String name, Object value) { if (value == null) return ""; return value; } }; // 列印返回結果 System.out.println(JSONObject.toJSONString(Response, SerializerFeature.WriteMapNullValue)); System.out.println(mvcResult.getResponse().getContentAsString()); } @Test public void addGirl() throws Exception { // Girl girl = new Girl(); // girl.setCupSize("B"); // girl.setAge(19); // girl.setMoney(22.22); //ObjectMapper 是一個可以重複使用的物件 ObjectMapper mapper = new ObjectMapper(); String jsonString = "{\"cupSize\":\"B\", \"age\":19, \"money\":22.22}"; //將JSON字串值轉換成 Girl物件裡的屬性值 Girl girl = mapper.readValue(jsonString, Girl.class); mvc.perform(MockMvcRequestBuilders.post("/girlsss") .contentType(MediaType.APPLICATION_JSON_UTF8) /* 使用writeValueAsString() 方法來獲取物件的JSON字串表示 */ .content(mapper.writeValueAsString(girl))) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(MockMvcResultMatchers.jsonPath( "$.cupSize").value("B")) .andExpect(MockMvcResultMatchers.jsonPath( "$.age").value(19)) .andExpect(MockMvcResultMatchers.jsonPath( "$.money").value(22.22)); } }