可能咱們在測試控制層的代碼都是啓動服務器,在瀏覽器中輸入URL,而後開始測試是否達到預期效果,發生錯誤的話,修改相關代碼並重啓服務器再次進行測試。分析一下這個過程,啓動服務器-->打開瀏覽器-->輸入URL-->等待返回結果-->修復bug-->重啓服務器.....循環。
其中的缺點也挺明顯的,在瀏覽器輸入URL的地址,若是是GET請求還好,POST請求或者DELETE請求怎麼辦?只能藉助其餘工具,經過命令行編寫curl語句,或者藉助谷歌瀏覽器的postman插件,亦或者本身在代碼中經過編寫相應httpClient方法來實現測試,可是這幾種方法都較爲麻煩,並且測試用例並不能較好的保存。再說一個缺點,代碼修改後,每每須要再次重啓服務器,等待啓動完畢才能接下來的測試過程。
若是tomcat服務器啓動速度較慢,這將是一件很是痛苦的事情,測試驗證也不方便,且依賴網絡環境,這些緣由致使測試起來很麻煩,而爲了能夠方便對Controller進行測試,且很好的保存和循環使用測試用例,則能夠經過單元測試來解決,經過前面一篇文章,你們對於單元測試的便利性有了認識和體會,接下來經過引入MockMVC進行控制層的單元測試。
MockMvc實現了對Http請求的模擬,可以直接使用網絡的形式,轉換到Controller的調用,這樣可使得測試速度快、不依賴網絡環境,並且提供了一套驗證的工具,這樣可使得請求的驗證統一併且很方便。java
pom依賴:web
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
controller:spring
@GetMapping("/lskTest") @ApiOperation(value="lskTest") public String lskTest(@RequestParam String uid){ return uid; }
alt+insert呼出快捷菜單數據庫
自動建立了test的包和class瀏覽器
在測試類前加上註解tomcat
@RunWith(SpringRunner.class) @SpringBootTest(classes = EurekaClientApplication.class) @WebAppConfiguration @ContextConfiguration public class RunControllerTest {
注意:個人springboottest的值爲「EurekaClientApplication」
這是這個模塊的main函數的名字:springboot
而後加上服務器
@Autowired private WebApplicationContext context; private MockMvc mvc;
再加上一個before網絡
@Before public void setUp() throws Exception { mvc = MockMvcBuilders .webAppContextSetup(context) .build(); }
在真實須要測試的代碼中加入mvc
@Test public void testUserController() throws Exception { RequestBuilder request = null; //路徑 request = get("/run/lskTest/") //參數 .param("uid", "1wqeqweqweqweqweq") //接受的數據類型 .accept(MediaType.APPLICATION_JSON); mvc.perform(request) //狀態嗎是否相等 .andExpect(status().isOk()) //獲得的信息是否與特定字段匹配 .andExpect(content().string("1wqeqweqweqweqweq")) //輸出信息 .andDo(print()); }
測試成功!
那麼數據庫的回滾呢?
加上註解@Rollback
同時在方法中加上註解@Transactional
若是不但願回滾 將rollback改成false便可