1

相较于测试service与dao层,测试controller部分稍微有些繁琐。

测试类的创建

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {Application.class})
public class ControllerTest {
   @Autowired
    private WebApplicationContext context;
    @MockBean
    MyService myService;
    
    MockMvc mockMvc;

    Logger logger = LoggerFactory.getLogger(MyControllerTest.class);

    @Before
    public void init(){
        mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
    }
    
}

首先需要引入web上下文使用其初始化Mockmvc。使用@Before来标注初始化方法使之在每次测试用例执行前都执行。之后在测试方法中写url的时候便可以不指定controller,注意如果在全局配置文件中指定了server.servlet.context-path属性,url不要携带。
由于单元测试的隔离性,使用@MockBean来模拟一个被该controller调用的service。被@MockBean标注的类的实例如果可以从spring容器中被获取,则优先使用这个模拟的实例。

测试传参方式为url传参的方法

@Test
public void getChangeOilList() throws Exception {
    MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
 params.add("pageSize", "10");
 params.add("pageNum", "1");
 params.add("tenantId", "1");
 Mockito.when(myService.getInfo(1L)).thenReturn("假数据");
 MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/getinfo").params(params))
            .andDo(MockMvcResultHandlers.print())
            .andReturn();
 logger.info(mvcResult.getResponse().getContentAsString());
}

这种方法多为get请求,需要实例化MultiValueMap的实例来存放参数,或者直接拼接在url中。使用Mockitowhen()thenReturn()方法可以指定调用模拟对象的方法所返回的结果,在这里thenRreturn()中应该放入假的对象来作为挡板隔离service层。

测试json形式传参的方法

@Test
public void changeTankOil() throws Exception {
        SetRequest request = new SetRequest();
        request.setId(0L);
        request.setStatus(0);
        Mockito.doNothing().when(myService).douPdate(request);
        MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.put("/update")
                .contentType(MediaType.APPLICATION_JSON)
                .content(JSONUtil.toJson(request)))
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
        logger.info(mvcResult.getResponse().getContentAsString());
}

这种方法通常属于get或者post请求,需要指定参数类型为json格式,示例中的JSONUtil为将对象json化的工具,非框架提供。使用MockitodoNothing()方法可以让调用返回值为void的方法时不执行任何操作,相当于执行成功的效果,以此来作为挡板。


guomz
16 声望1 粉丝

不求做完人,只求做凡人。