利用junit對springMVC的Controller進行測試

平時對junit測試service/DAO層已經很熟悉不過了,如果不瞭解,可以猛戳這裏,但是我們要測試controller層,不能總重啓服務器吧,(重啓tomcat好慢的飄過,別。。。別走啊),那麼我們就用junit4模擬請求,測試controller層的方法。

代碼1:直接Controller調用方法

import static org.junit.Assert.*;
import java.sql.SQLException;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.zz.login.web.LoginController;

/**
 * @author zhzh
 * 2015-4-7
 */
@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration({"classpath*:/beans.xml","classpath*:/spring-mvc.xml"})  
public class TestController {

    // 模擬request,response  
    private MockHttpServletRequest request;  
    private MockHttpServletResponse response;   

    // 注入loginController  
    @Autowired  
    private LoginController loginController ;  

    // 執行測試方法之前初始化模擬request,response  
    @Before    
    public void setUp(){    
        request = new MockHttpServletRequest();      
        request.setCharacterEncoding("UTF-8");      
        response = new MockHttpServletResponse();      
    }         
    /** 
     *  
     * @Title:testLogin 
     * @Description: 測試用戶登錄   
     */  
    @Test  
    public void testLogin() {   
        try {  
            request.setParameter("userName", "admin");
            request.setParameter("password", "2");
            assertEquals("login",loginController.loginIn(request,response)) ;  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}

代碼2:調用請求路徑

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
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.transaction.annotation.Transactional;
import org.springframework.web.context.WebApplicationContext;

/**
 * @author zhzh
 * 2015-4-7
 */
@RunWith(SpringJUnit4ClassRunner.class)  
@WebAppConfiguration  
@ContextConfiguration({"classpath*:/beans.xml","classpath*:/spring-mvc.xml"}) 
//當然 你可以聲明一個事務管理 每個單元測試都進行事務回滾 無論成功與否  
@TransactionConfiguration(defaultRollback = true)  
@Transactional 
public class TestController2 {
    @Autowired  
    private WebApplicationContext wac;  

    private MockMvc mockMvc; 

    @Before  
    public void setup() {   
        this.mockMvc = webAppContextSetup(this.wac).build();  
    } 

    @Test  
    public void testLogin() throws Exception {  
        mockMvc.perform((post("/loginTest").param("userName", "admin").param("password", "1"))).andExpect(status().isOk())  
                .andDo(print());  
    } 

    /*@Test  
    //有些單元測試你不希望回滾  
    @Rollback(false)  
    public void testInsert() throws Exception {  
        mockMvc.perform((post("/insertTest"))).andExpect(status().isOk())  
                .andDo(print());  
    } */
}
注意:import static 的spring類

代碼3:LoginController代碼片段

/**
     * 登錄入口
     * @param request
     * @param response
     * @return
     */
@RequestMapping(value = "/loginTest", method = RequestMethod.POST)
public String loginTest(HttpServletRequest request,HttpServletResponse response){
        String account = request.getParameter("userName");
        String password = request.getParameter("password");
        if (account.equals("admin")&&password.equals("1")){
            return "index";
        }else{
            return "login";
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章