SpringTest篇(二)Mock集成测试

使用MockMvc模拟应用集成环境进行测试。

@WebAppConfiguration必须标识出来,表示测试的环境为Web环境。

SpringMVC 测试 mockMVC——集成Web环境方式

MockMvc - 基于RESTful风格的SpringMVC的测试⭐

springmvc之单元测试(MockMvc)-独立测试

测试流程

  1. 准备测试环境
  2. 通过MockMvc执行请求
    1. 添加验证断言
    2. 添加结果处理器
    3. 获取MvcResult进行自定义断言/进行下一步的异步请求
  • mockMvc.perform:执行一个RequestBuilder请求,会自动执行SpringMVC的流程并映射到相应的控制器执行处理;
  • MockMvcRequestBuilders.get("/user/findAll):构造一个请求
  • ResultActions.andExpect:添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确;
  • ResultActions.andDo:添加ResultHandler结果处理器,比如调试时打印结果到控制台;
  • ResultActions.andReturn:最后返回相应的MvcResult;然后进行自定义验证/进行下一步的异步处理;

测试示例1

测试对象:

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/findAll")
    public ModelAndView findAll(ModelAndView mv) {
        List<User> userList = userService.findAll();
        userList.forEach(User::toString);
        mv.addObject("list", userList); //添加传递的数据
        mv.setViewName("list"); //找View层中的list.jsp
        return mv;
    }
}

测试启动类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath*:*.xml")
@WebAppConfiguration
public class TestController {
    @Autowired
    UserController userController;

    @Test
    public void testUserController() throws Exception {
        MockMvc mock = MockMvcBuilders.standaloneSetup(userController).build();
        mock.perform(get("/user/findAll"))
                .andExpect(status().isOk())
                .andExpect(forwardedUrl("list"));

    }
}

MockMvcBuilders

用于构造MockMvc的构造器,主要有两种实现:

  • DefaultMockMvcBuilder 集成测试整个Web环境
    • addFilters/addFilter 可增加过滤器
    • defaultRequest 默认的RequestBuilder,每次执行时会合并到自定义的RequestBuilder中,即提供公共请求数据的
    • alwaysExpect 定义每次执行请求时都进行验证的规则
    • alwaysDo 定义每次请求时都进行结果处理
    • dispatchOptions DispatcherServlet是否分发OPTIONS请求方法到控制器
  • StandaloneMockMvcBuilder 继承了DefaultMockMvcBuilder,可独立测试指定Controller

具体介绍看 springmvc之单元测试(MockMvc)-独立测试

MockHttpServletRequestBuilder

Http请求方法的构造器

MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables):根据uri模板和uri变量值得到一个GET请求方式的

MockHttpServletRequestBuilder;如**get("/user/{id}", 1L)**;

MockHttpServletRequestBuilder post(String urlTemplate, Object... urlVariables):同get类似,但是是POST方法;

MockHttpServletRequestBuilder put(String urlTemplate, Object... urlVariables):同get类似,但是是PUT方法;

MockHttpServletRequestBuilder delete(String urlTemplate, Object... urlVariables) :同get类似,但是是DELETE方法;

MockHttpServletRequestBuilder options(String urlTemplate, Object... urlVariables):同get类似,但是是OPTIONS方法;

MockMvcResultMatchers

Http请求结果的验证器

HandlerResultMatchers handler():请求的Handler验证器,比如验证处理器类型/方法名;此处的Handler其实就是处理请求的控制器;

RequestResultMatchers request():得到RequestResultMatchers验证器;

ModelResultMatchers model():得到模型验证器;

ViewResultMatchers view():得到视图验证器;

FlashAttributeResultMatchers flash():得到Flash属性验证;

StatusResultMatchers status():得到响应状态验证器;

HeaderResultMatchers header():得到响应Header验证器;

CookieResultMatchers cookie():得到响应Cookie验证器;

ContentResultMatchers content():得到响应内容验证器;

JsonPathResultMatchers jsonPath(String expression, Object ... args)/ResultMatcher jsonPath  (String expression, Matcher matcher):得到Json表达式验证器;

XpathResultMatchers xpath(String expression, Object... args)/XpathResultMatchers xpath(String expression, Map<string, string=""> namespaces, Object... args):得到Xpath表达式验证器;

ResultMatcher forwardedUrl(final String expectedUrl):验证处理完请求后转发的url(绝对匹配);

ResultMatcher forwardedUrlPattern(final String urlPattern):验证处理完请求后转发的url(Ant风格模式匹配,@since spring4);

ResultMatcher redirectedUrl(final String expectedUrl):验证处理完请求后重定向的url(绝对匹配);

ResultMatcher redirectedUrlPattern(final String expectedUrl):验证处理完请求后重定向的url(Ant风格模式匹配,@since spring4)

测试示例2

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath*:*.xml")
@WebAppConfiguration
public class TestController {

    @Autowired
    WebApplicationContext wac;

    MockMvc mock;

    @Autowired
    UserController userController;

    @BeforeClass
    public static void init() {
        System.out.println("@BeforeClass");
    }

    @Before
    public void initMock() {
        mock = MockMvcBuilders.webAppContextSetup(wac).build();
    }

    @Test
    public void testUserController() throws Exception {
        MvcResult result = mock.perform(get("/user/findAll"))
                .andExpect(status().isOk())
                .andExpect(forwardedUrl("/WEB-INF/pages/list.jsp"))
                .andDo(print())
                .andReturn();
        System.out.println(result.getModelAndView().toString());;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringTest是一个用于进行单元测试和集成测试的模块,它是Spring框架的一部分。通过使用SpringTest,开发人员可以方便地进行针对Spring组件的测试。 SpringTest模块提供了一些功能,如加载Spring ApplicationContext、缓存上下文以及提供用于测试的独立于代码的mock对象。 对于集成了Spring框架的项目,如果希望进行单元测试,可以使用SpringTest提供的功能。 有两种方法可以更加方便地进行单元测试。一种是使用spring-boot-test-starter,另一种是使用spring-test进行单元测试。 使用spring-test进行单元测试的基本配置是使用SpringJUnit4ClassRunner来运行测试。 通过使用SpringTest,开发人员可以在单元测试中更高效地进行Spring组件的测试。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Java单元测试实践-03.使用spring-test进行单元测试](https://blog.csdn.net/a82514921/article/details/107969384)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [如何在Spring环境中进行单元测试](https://blog.csdn.net/nethackatschool/article/details/124572483)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值