1. 程式人生 > >Springboot---Controller單元測試

Springboot---Controller單元測試

知識準備

1、註解含義

@RunWith(SpringRunner.class):表示使用Spring Test元件進行單元測試,其中SpringRunner繼承類SpringJUnit4ClassRunner。  @WebAppConfiguration:測試環境使用,用來表示測試環境使用的ApplicationContext將是WebApplicationContext型別的;value指定web應用的根;  @AutoConfigureMockMvc:注入一個MockMvc例項;

注入web環境的ApplicationContext容器:mvc = MockMvcBuilders.webAppContextSetup(context).build(); 

2、fastjson轉換--物件欄位值為null的json化

        //方式一:
        /**
         * 自定義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));
    }
}