Java知識點總結(jié):想看的可以從這里進入
2.13、測試
測試就是在開發(fā)過程中用來檢測某一段代碼的功能是否能正確執(zhí)行,Spring Boot 項?創(chuàng)建時會默認單元測試框架 spring-boot-test,它Spring Test、JUnit等其他測試框架結(jié)合起來(JUnit 5、AssertJ、Hamcrest、Mockito、JSONassert、JsonPath、Spring Test和Spring Boot Test)。
在使用測試是可以直接通過啟動器:spring-boot-starter-test得到測試的支持。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
在SpringBoot中提供了一些注解來幫助我們進行測試:
-
@SpringBootTest:尋找一個主配置類(@SpringBootApplication),并使用它來啟動Spring應(yīng)用程序上下文。SpringBootTest加載完整的應(yīng)用程序并注入所有可能的bean,因此需要一定時間。
- MOCK(默認值):加載web ApplicationContext并提供一個模擬web環(huán)境,嵌入式服務(wù)器不會啟動,可以與@AutoConfigureMockMvc或@AutoConfigureWebTestClient一起使用,用于基于模擬的web應(yīng)用程序測試。
- RANDOM_PORT:加載一個WebServerApplicationContext并提供一個真實的web環(huán)境。嵌入式服務(wù)器在一個隨機端口上啟動并監(jiān)聽。
- DEFINED_PORT:加載WebServerApplicationContext并提供一個真實的web環(huán)境。嵌入式服務(wù)器將啟動并在一個已定義的端口(yml中)或默認端口8080上偵聽。
- NONE:通過使用SpringApplication加載ApplicationContext,但不提供任何web環(huán)境(模擬或其他)。
-
@Test:用在方法上進行測試實際的業(yè)務(wù)邏輯
-
@AutoConfigureMockMvc:和SpringBootTest 一起使用,可以自動配置MockMvc,測試Controller
2.12.1、 Junit單元測試
1、測試
需要添加用于單元測試的啟動器,該啟動器會自動導(dǎo)入 junit 的相關(guān)依賴:
<!--單元測試-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
使用測試 可以對項目中的方法進行測試,看它的執(zhí)行是否能達到我們的預(yù)期效果,對相應(yīng)的類創(chuàng)建對應(yīng)的測試類,在方法上添加注解 @Test,就能使測試方法如同 main方法一樣可以直接運行,這樣就能觀察到該方法最終執(zhí)行的效果。
我們可以使用 IDEA 對某個類直接生成單元測試類。
-
在相應(yīng)的類中 按 ctrl+shitf+T快捷鍵
-
選擇需要測試的方法,并生成測試的類(?成了單元測試的框架類,具體的業(yè)務(wù)代碼要??填充)
-
選擇一個select 方法生成測試類
-
添加注解SpringBootTest注解(可以加載被管理的Bean),并編寫業(yè)務(wù)邏輯
2、常用注解
-
@SpringBootTest:是一個組合注解,內(nèi)部含有 JUnit5中使用 的運行器注解 @ExtendWith
-
@Test:用在方法上,表示該方法是一個測試用方法,使可以運行
-
@DisplayName(“名稱”):給測試類設(shè)置一個名稱
-
增強處理
- @BeforeEach:前置方法,每個測試方法執(zhí)行前都會執(zhí)行
- @AfterEach:后置方法,在每個測試方法執(zhí)行后都會執(zhí)行
- @BeforeAll:表示在所有測試方法之前執(zhí)行
- @AfterAll:表示在所有測試方法之后執(zhí)行
@SpringBootTest @Slf4j class JunitTest { @Test public void test() { log.info("測試1"); } @Test public void test2() { log.info("測試2"); } @Test public void test3(){ log.info("測試3"); } @BeforeEach public void BeforeEach(){ log.info("在每個方法執(zhí)行前執(zhí)行"); } @AfterEach public void afterEach(){ log.info("在每個方法執(zhí)行后執(zhí)行"); } @BeforeAll static void beforeAll(){ log.info("在所有測試方法執(zhí)行前執(zhí)行"); } @AfterAll static void afterAll(){ log.info("在所有測試方法執(zhí)行后執(zhí)行"); } }
-
@Disabled:用在測試方法前,單獨執(zhí)行該方法時可以運行,但是如果點擊測試類運行測試類內(nèi)所有方法時,則加上此注解的方法不會運行
-
@Timeout(value =超時時間,unit = 超時時間單位):設(shè)置方法的執(zhí)行時間,如果超時會出現(xiàn)異常。
TimeUnit.DAYS:代表二十四小時的時間單位
TimeUnit.HOURS:代表六十分鐘的時間單位
TimeUnit.MINUTES:代表六十秒的時間單位。
TimeUnit.SECONDS:時間單位代表一秒
TimeUnit.MILLISECONDS:表示千分之一秒的時間單位。
TimeUnit.MICROSECONDS:表示千分之一毫秒的時間單位
TimeUnit.NANOSECONDS:表示千分之一微秒的時間單位
-
@RepeatedTest(次數(shù)) :該方法每次運行都會執(zhí)行指定次數(shù)。需要去掉@Test注解
3、斷言
其中類Assertions是支持在測試中斷言條件的實用方法的集合,除非另有說明,否則失敗的斷言將拋出org.opentest4j.AssertionFailedError或其子類。所有 JUnit斷言 都是 org.junit.jupiter.Assertions 類中的靜態(tài)方法
1、assertTrue(boolean condition):判斷給定的boolean是否為true
2、assertFalse(boolean condition):判斷給定的boolean是否為false
3、assertNull(Object actual):判斷 Object 是否為null
4、assertNotNull(Object actual):判斷 Object 不是null
5、assertEquals(o1,o2):判斷兩個對象是否相等
6、assertArrayEquals([],[]):判斷連個數(shù)組是否相等
2.12.2、MockMvc
Junit 無法測試Controller中的方法,因為它是一種網(wǎng)絡(luò)請求,所有我們可以使用 MockMvc 對Controller方法 進行測試
MockMvc是由spring-test包提供,MockMvc實現(xiàn)了對Http請求的模擬,能夠直接使用網(wǎng)絡(luò)的形式,轉(zhuǎn)換到Controller的調(diào)用,使請求的驗證變得更加方便。
這里有兩個注解:
-
@WebMvcTest:使用此注解會禁用完全自動配置,僅僅配置MVC相關(guān)配置
-
@AutoConfigureMockMvc:自動配置MockMvc
使用@AutoConfigureMockMvc+@SpringBootTest進行測試:
-
正常創(chuàng)建Controller
@Controller @RequestMapping("/testMockMvc") public class UserinfoController { @Resource private UserinfoService userinfoService; @GetMapping("/getUserinfo") @ResponseBody public Userinfo userinfo(long id){ return userinfoService.getById(id); } @GetMapping("/hello") public String hello(String name , Model model){ model.addAttribute("user", name+"歡迎歡迎"); return "hello"; } }
-
編寫測試類
@SpringBootTest @AutoConfigureMockMvc public class UserControllerTest { @Autowired private MockMvc mockMvc; /* * 1、mockMvc.perform執(zhí)行一個請求。 * MockMvcRequestBuilders.get("XXX") get提交訪問controller的一個接口。 * MockMvcRequestBuilders.post("XXX") post提交訪問controller的一個接口。 * .param 傳遞的參數(shù) * .accept(MediaType.TEXT_HTML_VALUE))接受的響應(yīng)結(jié)果的文檔類型 * .contentType 請求數(shù)據(jù)的文檔類型 * .content() 可以傳遞JSON數(shù)據(jù) * 2、.andExpect 添加執(zhí)行完成后的斷言。 * 3、.andDo 添加一個結(jié)果處理器,表示要對結(jié)果做點什么事情 * 比如此處使用MockMvcResultHandlers.print()輸出整個響應(yīng)結(jié)果信息。 * 7、.andReturn表示執(zhí)行完成后返回相應(yīng)的結(jié)果。 */ @Test public void getUserinfo() throws Exception { MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/testMockMvc/getUserinfo") .param("id","1") .contentType(MediaType.APPLICATION_JSON) ).andDo(print()) .andExpect(status().isOk()) .andReturn(); } @Test public void hello() throws Exception { MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/testMockMvc/hello") .param("name","yu") ).andDo(print()) .andExpect(status().isOk()) .andReturn(); } }
-
測試頁面跳轉(zhuǎn)文章來源:http://www.zghlxwxcb.cn/news/detail-735706.html
-
測試返回數(shù)據(jù)文章來源地址http://www.zghlxwxcb.cn/news/detail-735706.html
到了這里,關(guān)于SpringBoot測試(Junit單元測試、MockMvc測試Http請求 )的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!