平時對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"; } }
