`

基于Spring-WS的Restful API的集成测试

阅读更多
在很多Java企业级应用中,Spring占据了非常重要的位置,这就导致了基本上的技术选型都是围绕着Spring来, 比方说笔者最近的项目需要开发一个Restful的API接口,选型的时候就说,客户架构师直接就拍了spring-ws,原因呢?系统中其他的模块都是用的Spring-ws,保持一致,而且社区活跃,文档丰富,遇到问题易解决。好了,入正题。

既然选定了Spring-WS, 已经TDD入魔的我,首先想到的就是我应该怎么测试这个API接口呢? 作为业界最成熟的框架,Spring为测试其Web应用提供了非常好用的辅助类MockMvc。

首先,在项目的测试代码中加入辅助Spring Web测试的库
testCompile(
            "org.springframework:spring-test:$springVersion",
            "org.springframework.ws:spring-ws-test:2.1.0.RELEASE",
            "javax.servlet:javax.servlet-api:3.0.1",
            "com.jayway.jsonpath:json-path-assert:0.9.0"
    )
其中,jsonpath库的依赖是为了更好的做json格式数据的断言。

然后,编写测试代码
//指定使用SpringIntegration测试,并且制定了运行测试的ApplicationContext
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-servlet.xml"})
public class ApiControllerIntegrationTest {

    @Autowired
    private ApiController controller;

    private MockMvc mockMvc;

    @Before
    public void setUp() throws Exception {
        //绑定需要测试的Controller到MockMvcshang
        mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
    }

    @Test
    public void testGet() throws Exception {
        //发出请求,在请求中可以设置一个http request可设置的所有参数
        mockMvc.perform(get("/requests/1")
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON)
                .param("userId", "xianlinbox")
        )
        //验证Respondse,status()中,可验证所有的HTTP Status CODE
        //另外,使用了jsonPath更优雅的做json属性值的验证
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.userId").value("xianlinbox"))
                .andExpect(jsonPath("$.requestId").value("1"))
                .andExpect(jsonPath("$.requestType").value("GET"));
    }

    @Test
    public void testPost() throws Exception {
        mockMvc.perform(post("/requests")
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON)
                .content("this is the message")
                .param("userId", "xianlinbox")
        )
                //使用print()可打印出当前测试设计的HTTP Request/Responsed的所有信息,方便定位问题
                //Post方法的返回结果应该是202(HttpStatus.Created),对象创建成功
                .andDo(print())
                .andExpect(status().isCreated())
                .andExpect(jsonPath("$.userId").value("xianlinbox"))
                .andExpect(jsonPath("$.requestType").value("POST"))
                .andExpect(jsonPath("$.message").value("this is the message"));
    }

}

testPost方法中的print()语句打印出的效果如下:
MockHttpServletRequest:
         HTTP Method = POST
         Request URI = /requests
          Parameters = {userId=[xianlinbox]}
             Headers = {Content-Type=[application/json], Accept=[application/json]}

             Handler:
                Type = com.xianlinbox.api.ApiController
              Method = public com.xianlinbox.api.Request com.xianlinbox.api.ApiController.post(java.lang.String,java.lang.String)

               Async:
   Was async started = false
        Async result = null

  Resolved Exception:
                Type = null

        ModelAndView:
           View name = null
                View = null
               Model = null

            FlashMap:

MockHttpServletResponse:
              Status = 201
       Error message = null
             Headers = {Content-Type=[application/json;charset=UTF-8]}
        Content type = application/json;charset=UTF-8
                Body = {"userId":"xianlinbox","requestId":"1","requestType":"POST","message":"this is the message"}
       Forwarded URL = null
      Redirected URL = null
             Cookies = []

看完了测试, 来简单的看下具体的实现代码:
@Controller
public class ApiController {

    @RequestMapping(value = "/requests/{requestId}", method = RequestMethod.GET)
    @ResponseBody
    public Request get(@PathVariable String requestId, @RequestParam(value = "userId") String userId) {
        return new Request(userId, requestId, "GET");
    }

    @RequestMapping(value = "/requests", method = RequestMethod.POST)
    @ResponseBody
    @ResponseStatus(value = HttpStatus.CREATED)
    public Request post(@RequestParam(value = "userId") String userId, @RequestBody String content) {
        Request request = new Request(userId, "1", "POST");
        request.setMessage(content);
        return request;
    }
}

  • 使用RequestMapping定义URL
  • 使用@ResponseBody表示返回json
  • 使用@PathVariable 获取路径参数
  • 使用@RequestParam获取request payload中的参数
  • 使用@RequestBody获取request body
  • 使用@ResponseStatus(value = HttpStatus.CREATED),定义返回的HTTP STATUS CODE


该Demo的所有代码: https://github.com/xianlinbox/TDD_Demo/tree/master/spring-ws-rest
2
0
分享到:
评论
1 楼 zzq0324 2016-10-12  
http://git.oschina.net/zzq0324/restful-tester
这个就可以验证业务了。

相关推荐

    使用 Spring-WS 完成的 Web Service (SOAP)

    4. **Spring 框架集成**:Spring-WS 基于 Spring 框架,可以无缝集成到现有的 Spring 应用程序中。这包括利用 Spring 的依赖注入(DI)和面向切面编程(AOP)特性,提高代码的可维护性和灵活性。 5. **消息映射**:...

    jax-ws jax-rs 分别创建soap和restful类型的webservice

    本篇将详细介绍如何使用Java技术栈,特别是JAX-WS和JAX-RS,以及Maven和Spring来创建这两种不同类型的Web服务。 首先,让我们关注SOAP Web服务的创建,这是通过JAX-WS实现的。JAX-WS是Java API for XML Web ...

    spring-framework-2.0-with-dependencies.zi

    8. **测试支持**:Spring 2.0引入了Spring Test模块,提供了针对Spring应用的集成测试框架,使得单元测试和集成测试变得更加便捷。 9. **容器增强**:Spring 2.0的Bean容器进行了优化,支持基于XML和基于注解的配置...

    官方原版源码spring-framework-5.2.0.RELEASE.zip

    - **测试框架的改进**:Spring Test框架提供了更多测试工具和API,简化了单元测试和集成测试的编写。 对于开发者而言,深入研究Spring Framework 5.2.0的源码,可以了解到设计模式的应用,如工厂模式、单例模式、...

    SPRING-MVC-MQ-CXF-REST_Demo

    在Spring框架中,可以通过Spring MVC的@RestController注解和@RequestMapping等注解轻松实现RESTful API的开发,提供JSON、XML等数据格式的接口。 【Demo项目结构】 "SPRING-MVC-MQ-CXF-REST_Demo"这个项目很可能是...

    使用Eclipse开发基于SpringBoot+JAX-RS的Restful服务.docx

    在本文中,我们将深入探讨如何使用Eclipse开发一个基于Spring Boot和JAX-RS的Restful服务。首先,让我们理解一下这两个关键技术和Restful服务的基本概念。 **Spring Boot** 是一个用于简化Spring应用初始搭建以及...

    spring-framework-3.0.5.RELEASE.zip

    4. **单元测试**:通过Mockito和Spring Test等工具,可以方便地进行单元测试和集成测试,确保代码质量。 5. **Web服务开发**:Spring Web Services提供了一整套工具,帮助开发者构建基于WSDL的SOAP服务和RESTful...

    spring-cxf WebService

    【Spring-CXF WebService】是基于Spring框架和Apache CXF实现的一个Web服务示例,它展示了如何在Spring环境中集成CXF来创建、部署和消费Web服务。Spring-CXF结合了Spring的强大功能和CXF的优秀Web服务支持,使得开发...

    CXF-Spring-Client-J.zip

    它支持SOAP、RESTful等多种通信方式,并能与Spring框架无缝集成。"CXF-Spring-Client-J.zip"这个压缩包文件显然提供了一个关于如何在Spring环境中配置和使用CXF客户端的示例。 首先,我们需要理解Spring和CXF的整合...

    spring-cxf-ws:一些使用spring和cxf生成webservice Rest和Soap的例子

    7. **测试**:Spring和CXF都提供了丰富的测试工具,例如,你可以使用CXF的模拟服务器(Mock Server)进行单元测试,使用Spring MVC Test框架进行集成测试。 8. **持续集成**:在"spring-cxf-ws"项目中,可能会包含...

    spring-framework-2.5.6-I

    2.5.6版本引入了测试工具,如Spring TestContext Framework,支持单元测试和集成测试,方便开发者进行代码验证。 8. **Spring AOP增强** 在2.5.6版本中,Spring对AOP进行了增强,支持更多类型的切点表达式,包括...

    spring-jersey-ws:使用 Jersey 和 Spring 堆叠 Restful Web 服务

    Jersey是JAX-RS(Java API for RESTful Web Services)规范的实现,而Spring则是Java领域广泛应用的轻量级框架,它提供了丰富的功能,包括依赖注入、AOP(面向切面编程)以及服务管理。 首先,我们需要理解REST...

    CXF3.0+Spring3.2 RESTFul服务(下)

    【CXF3.0+Spring3.2 RESTFul服务(下)】 在现代Web服务开发中,RESTful API已经成为主流,它通过HTTP协议提供简洁、无状态的接口,易于客户端调用。CXF,一个强大的开源服务框架,支持SOAP和RESTful服务,而Spring...

    spring-webservice-example

    - **测试文件**:可能包含单元测试和集成测试,用于验证服务的正确性。 - **README**:提供了项目简介、安装指南和使用说明。 通过研究这个项目,我们可以学习如何设置Spring Boot环境,配置Spring-WS,设计和实现...

    Restful WebService + Spring

    **Spring与RESTful集成的关键点:** 1. **配置**:通过`@EnableWebMvc`或在Spring Boot中使用`spring-boot-starter-web`启动器启用Web MVC支持。 2. **URL映射**:使用`@RequestMapping`和其子注解来定义URL路径和...

    webservice CXF结合Spring所需jar包

    本篇文章将深入探讨如何使用CXF与Spring集成,以及在开发过程中所需的jar包。 首先,让我们理解Web服务的基本概念。Web服务是一种通过网络(通常基于HTTP协议)进行通信的应用程序接口(API)。它允许不同系统间的...

    官方源码 spring-framework-5.2.14.RELEASE.zip

    Spring还包含对WS(Web Services)的支持,提供了创建和消费Web服务的能力,包括基于SOAP的WS和RESTful WS。 通过阅读和理解Spring Framework 5.2.14.RELEASE的源码,开发者不仅可以学习到优秀的设计模式和编程...

    webservice,spring源码

    这个示例可能包括了Spring对WebService的支持,如SOAP(Simple Object Access Protocol)或者RESTful API的实现。此外,由于涉及到数据库连接,所以也意味着Web服务可能与数据库交互,进行数据的增删改查操作。值得...

    spring-framework-3.1.1.RELEASE-with-docs

    6.1 **测试工具**:Spring的测试模块提供了一套完整的测试框架,包括单元测试、集成测试和模拟对象。3.1.1.RELEASE版本中,测试支持更加强大,如支持JSR-303/JSR-349 Bean Validation,使得测试驱动开发(TDD)更加...

    JAVAspring-使用javaspring开发的web服务.zip

    - **单元测试和集成测试**:使用JUnit和Mockito等工具对代码进行测试,确保功能正确性。 - **安全配置**:Spring Security用于处理身份验证和授权,保护Web服务不被非法访问。 - **日志记录**:通过Log4j、SLF4J等...

Global site tag (gtag.js) - Google Analytics