相较于测试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中。使用Mockito
的when()
加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化的工具,非框架提供。使用Mockito
的doNothing()
方法可以让调用返回值为void的方法时不执行任何操作,相当于执行成功的效果,以此来作为挡板。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。