@Test
@SpringBootTest
class SpringbootRedisApplicationTests {
@Test
void contextLoads() {
//测试自己需要的方法
}
}
JUnit_MockMvc,主要测试controller
使用这个进行测试,是为了方便自己不用启动整个项目,还有更快的了解自己的需要,不用一遍又一遍的去启动项目,极大的减少了自己的工作量。意思就是,用什么就启动什么。我这么理解,要是有更好的可以评论
src 下的controller
@Controller
@RequestMapping("/")
public class IndexController {
@GetMapping("/index")
public String index(Model model){
List list = new ArrayList();
list.add("hello,world0");
list.add("hello,teacher");
list.forEach(System.out::print);
System.out.println("======>");
list.forEach((e)-> System.out.println(e));
model.addAttribute("list",list);
return "index";
}
@PostMapping("/post")
@ResponseBody
public String hello(String name){
return "hello "+name;
}
}
test下的mockmvc测试
@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class IndexControllerTest {
private MockMvc mockMvc;
@Autowired
private WebApplicationContext webApplicationContext;
@Before
public void setup() {
// 实例化方式一
mockMvc = MockMvcBuilders.standaloneSetup(new IndexController()).build();
// 实例化方式二
// mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
@Test
public void testHello() throws Exception {
mockMvc.perform(MockMvcRequestBuilders
.post("/post")
// 设置返回值类型为utf-8,否则默认为ISO-8859-1
.accept(MediaType.APPLICATION_JSON_VALUE)
.param("name","lvgang"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().string("hello lvgang"))
.andDo(MockMvcResultHandlers.print());
}
}
执行后结果显示
MockHttpServletRequest:
HTTP Method = POST
Request URI = /post
Parameters = {name=[lvgang]}
Headers = [Accept:"application/json"]
Body =
Session Attrs = {}
Handler:
Type = com.hechao.controller.IndexController
Method = com.hechao.controller.IndexController#hello(String)
Async:
Async started = false
Async result = null
Resolved Exception:
Type = null
ModelAndView:
View name = null
View = null
Model = null
FlashMap:
Attributes = null
MockHttpServletResponse:
Status = 200
Error message = null
Headers = [Content-Type:"application/json", Content-Length:"12"]
Content type = application/json
Body = hello lvgang
Forwarded URL = null
Redirected URL = null
cookies = []
Process finished with exit code 0
以下是涉及到的一些源码
MockMvcRequestBuilders ,是根据resuleful风格进行的
请求的返回值是MockHttpServletRequestBuilder类型
设置数据类型,有json,xml等等,可以看源码,根据需求选择
public MockHttpServletRequestBuilder accept(MediaType... mediaTypes) {
Assert.notEmpty(mediaTypes, "'mediaTypes' must not be empty");
this.headers.set("Accept", MediaType.toString(Arrays.asList(mediaTypes)));
return this;
}
还有请求的参数,通过这设置,单个的,多个的(可以用k-v进行处理)
内部使用的Iterator外部迭代
public MockHttpServletRequestBuilder param(String name, String... values) {
addToMultiValueMap(this.parameters, name, values);
return this;
}
public MockHttpServletRequestBuilder params(MultiValueMap params) {
params.forEach((name, values) -> {
Iterator var3 = values.iterator();
while(var3.hasNext()) {
String value = (String)var3.next();
this.parameters.add(name, value);
}
});
return this;
}
基本的controller层请求,正常逻辑就结束了,就剩下返回值的校验了
通过MockMvcResultMatchers类下的方法根据需求进行对比。
成功的结果在上面



