Spring Boot:(十二)Spring Boot使用單元測試
前言
這次來介紹下Spring Boot中對單元測試的整合使用,本篇會通過以下4點來介紹,基本滿足日常需求
- Service層單元測試
- Controller層單元測試
- 新斷言assertThat使用
- 單元測試的回滾
正文
Spring Boot中引入單元測試很簡單,依賴如下:1 2 3 4 5
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope
本篇例項Spring Boot版本為1.5.9.RELEASE,引入spring-boot-starter-test後,有如下幾個庫:
• JUnit — The de-facto standard for unit testing Java applications.
• Spring Test & Spring Boot Test — Utilities and integration test support for Spring Boot applications.
• AssertJ — A fluent assertion library.
• Hamcrest — A library of matcher objects (also known as constraints or predicates).
• Mockito — A Java mocking framework.
• JSONassert — An assertion library for JSON.
• JsonPath — XPath for JSON.
Service單元測試
Spring Boot中單元測試類寫在在src/test/java目錄下,你可以手動建立具體測試類,如果是IDEA,則可以通過IDEA自動建立測試類,如下圖,也可以通過快捷鍵⇧⌘T
(MAC)或者Ctrl+Shift+T
(Window)來建立,如下:
然後再編寫建立好的測試類,具體程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package com.dudu.service; import com.dudu.domain.LearnResource; import org.junit.Assert; |
上面就是最簡單的單元測試寫法,頂部只要@RunWith(SpringRunner.class)
和SpringBootTest
即可,想要執行的時候,滑鼠放在對應的方法,右鍵選擇run該方法即可。
測試用例中我使用了assertThat斷言,下文中會介紹,也推薦大家使用該斷言。
Controller單元測試
上面只是針對Service層做測試,但是有時候需要對Controller層(API)做測試,這時候就得用到MockMvc了,你可以不必啟動工程就能測試這些介面。
MockMvc實現了對Http請求的模擬,能夠直接使用網路的形式,轉換到Controller的呼叫,這樣可以使得測試速度快、不依賴網路環境,而且提供了一套驗證的工具,這樣可以使得請求的驗證統一而且很方便。
Controller類:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | package com.dudu.controller; /** 教程頁面 * Created by tengj on 2017/3/13. */ @Controller "/learn") (public class LearnController extends AbstractController{ private LearnService learnService; private Logger logger = LoggerFactory.getLogger(this.getClass()); "") ( public String learn(Model model){ model.addAttribute("ctx", getContextPath()+"/"); return "learn-resource"; } /** * 查詢教程列表 * @param page * @return */ "/queryLeanList",method = RequestMethod.POST) (value = public AjaxObject queryLearnList(Page<LeanQueryLeanListReq> page){ List<LearnResource> learnList=learnService.queryLearnResouceList(page); PageInfo<LearnResource> pageInfo =new PageInfo<LearnResource>(learnList); return AjaxObject.ok().put("page", pageInfo); } /** * 新添教程 * @param learn */ "/add",method = RequestMethod.POST) (value = public AjaxObject addLearn(@RequestBody LearnResource learn){ learnService.save(learn); return AjaxObject.ok(); } /** * 修改教程 * @param learn */ "/update",method = RequestMethod.POST) (value = |