本篇文章為大家展示了Spring MVC應(yīng)用如何進(jìn)行測(cè)試,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
創(chuàng)新互聯(lián)建站主要從事網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)岳塘,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18982081108Spring的依賴注入使得我們的代碼非常容易進(jìn)行單元測(cè)試——@Controller
, @Service
,@Entity
等注解標(biāo)注的類基本都是POJO(plain old Java object),也就是說(shuō)很少依賴于Spring容器本身的API。我們可以非常容易地使用JUnit或TestNG編寫(xiě)測(cè)試代碼。另一方面,對(duì)于三層架構(gòu)的Spring Web應(yīng)用(Controller, Service, DAO),使用Mock活Stub方法也能夠更好的來(lái)測(cè)試我們的代碼邏輯。例如Service層代碼的單元測(cè)試中,依賴的DAO(或Repository)對(duì)象都是根據(jù)應(yīng)用測(cè)試需求Mock出來(lái)的,而不需要真正去訪問(wèn)數(shù)據(jù)庫(kù)。
Spring Web測(cè)試
在對(duì)Spring Web應(yīng)用中的@Controller
代碼進(jìn)行單元測(cè)試的過(guò)程中,一般的方法是創(chuàng)建@Controller
對(duì)象,同時(shí)將它依賴的一些Mock對(duì)象——例如MockHttpServletRequest, MockHttpServletResponse(都由spring-test模塊提供,無(wú)需自己編寫(xiě))作為@Controller方法的參數(shù)。但是對(duì)于處理Web請(qǐng)求的@Controller代碼來(lái)說(shuō),僅僅測(cè)試Handler方法里的代碼是遠(yuǎn)遠(yuǎn)不夠的,對(duì)于一個(gè)處理HTTP請(qǐng)求的@Controller`,我們還需要測(cè)試:
@RequestMapping
路由是否正確@PathVariable
等@InitBinder
, @ModelAttribute
, @ExceptionHandler
等注解的方法或?qū)傩杂?jì)算過(guò)程上述過(guò)程貫穿于HTTP請(qǐng)求處理的生命周期中,所以對(duì)于Spring Web應(yīng)用中@Controller
代碼單元測(cè)試的概念,應(yīng)該做一些擴(kuò)充——不僅僅局限于代碼本身,也要結(jié)合MVC框架中的各個(gè)處理過(guò)程。
本文接下來(lái)的內(nèi)容代碼,都以Spring Boot為例,首先假設(shè)我們通過(guò)Spring Boot創(chuàng)建了一個(gè)最簡(jiǎn)單的Web Mvc應(yīng)用——包含了一個(gè)最簡(jiǎn)單的Conroller,處理/users/{id}
對(duì)應(yīng)的HTTP請(qǐng)求,返回值是id={id}
(通過(guò)String.format()
方法),那么可以為它創(chuàng)建如下測(cè)試代碼:
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = SpringMvcTestDemoApplication.class) @WebAppConfiguration public class SpringMvcTestDemoApplicationTests { private MockMvc mockMvc; @Before public void init() { this.mockMvc = MockMvcBuilders.standaloneSetup(new UserController()).build(); } @Test public void getUserById() throws Exception { long id = 1; this.mockMvc.perform(get("/users/" + id)) .andExpect(status().isOk()) .andExpect(content().string("id=" + id)); } }