springmvc单元测试

作为WEB开发人员在开发过程中总是需要测试各种请求
常规的方法则是启动WEB服务器 测试 出错 停掉WEB 改代码 重启WEB 测试
大量的时间都浪费在WEB服务器的启动上
今天给大家介绍一种不用启动WEB 直接采用单元测试的方法来测试请求是否准确
该方法基于SpringMVC 与 spring Test 框架
如果大家对SpringMVC的基本知识不了解,请先百度一下.

直接上代码

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;

import java.net.URI;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.WebApplicationContext;  

@RunWith(SpringJUnit4ClassRunner.class)  
@WebAppConfiguration  
@ContextConfiguration(locations = {"classpath:spring-context.xml","classpath:spring-mvc.xml","classpath:spring-context-shiro.xml","classpath:spring-context-jedis.xml","classpath:spring-context-activiti.xml"})  
//当然 你可以声明一个事务管理 每个单元测试都进行事务回滚 无论成功与否  
@TransactionConfiguration(defaultRollback = true)  
//记得要在XML文件中声明事务哦~~~我是采用注解的方式  
@Transactional  
public class ExampleTests {  

    @Autowired  
    private WebApplicationContext wac;  

    private MockMvc mockMvc;  

    @Before  
    public void setup() {  
        // webAppContextSetup 注意上面的static import  
        // webAppContextSetup 构造的WEB容器可以添加fileter 但是不能添加listenCLASS  
        /* WebApplicationContext context =  
         ContextLoader.getCurrentWebApplicationContext();  */
        // 如果控制器包含如上方法 则会报空指针  
       // this.mockMvc = webAppContextSetup(wac).build();  
        MockitoAnnotations.initMocks(this);
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).dispatchOptions(true).build();
    }  

    @Test  
     //有些单元测试你不希望回滚  
     @Rollback(false)  
    public void ownerId() throws Exception {  
        URI uri = new URI("/app/spring/rest");
        MockHttpServletRequestBuilder b = get(uri);
        //MockHttpServletRequestBuilder b =     MockMvcRequestBuilders.post(uri);
        mockMvc.perform(b)
                .andDo(print());  
    }  

//    @Test  
//    public void test() throws Exception {  
//        mockMvc.perform((get("/spring/test"))).andExpect(status().isOk())  
//                .andDo(print())  
//                .andExpect(model().attributeHasNoErrors("teacher"));  
//    }  
//  
//    @Test  
//    public void testb() throws Exception {  
//        mockMvc.perform((get("/spring/testb"))).andExpect(status().isOk())  
//                .andDo(print());  
//    }  
//  
//    @Test  
//    public void getAccount() throws Exception {  
//        mockMvc.perform((post("/spring/post").param("abc", "def")))  
//                .andExpect(status().isOk()).andDo(print());  
//    }  
//  
}

下面是坑

当出现以下问题时请不要慌

MockHttpServletRequest:
         HTTP Method = GET
         Request URI = /app/spring/rest
          Parameters = {}
             Headers = {}

             Handler:
                Type = null

               Async:
   Was async started = false
        Async result = null

  Resolved Exception:
                Type = null

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

            FlashMap:

MockHttpServletResponse:
              Status = 404
       Error message = null
             Headers = {}
        Content type = null
                Body = 
       Forwarded URL = null
      Redirected URL = null
             Cookies = []

或出现这个

java.lang.AssertionError: Status expected:<200> but was:<404>
    at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:60)
    at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:89)
    at org.springframework.test.web.servlet.result.StatusResultMatchers$5.match(StatusResultMatchers.java:549)
    ...

这是因为DispatcherServlet里边找不到对应的名字就是接口(/app/spring/rest)
找不到对应的类了,注意@ContextConfiguration里边是否加载了annotation扫描

maven中配置

<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.0.8.RELEASE</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mockito/mockito-all -->
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <version>1.8.4</version>
            <scope>test</scope>
        </dependency>

…明明有很多问题的。。。写的时候居然想不起来了。算了想起来再说吧。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值