溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在SpringBoot2中實(shí)現(xiàn)單元測(cè)試

發(fā)布時(shí)間:2021-05-18 18:16:45 來源:億速云 閱讀:284 作者:Leah 欄目:編程語(yǔ)言

今天就跟大家聊聊有關(guān)怎么在SpringBoot2中實(shí)現(xiàn)單元測(cè)試,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

一 普通測(cè)試類

當(dāng)有一個(gè)測(cè)試方法的時(shí)候,直接運(yùn)行。

要在方法前后做事情,可以用before或者after。

假如有多個(gè)方法運(yùn)行,則可以選擇類進(jìn)行運(yùn)行。

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestApplicationTests {
  @Test
  public void testOne(){
    System.out.println("test hello 1");
    TestCase.assertEquals(1, 1);   
  } 
  @Test
  public void testTwo(){
    System.out.println("test hello 2");
    TestCase.assertEquals(1, 1);    
  }  
  @Before
  public void testBefore(){
    System.out.println("before");
  }  
  @After
  public void testAfter(){
    System.out.println("after");
  }
}

測(cè)試結(jié)果:

2019-10-28 21:17:25.466 INFO 18872 --- [      main] com.example.demo.TestApplicationTests  : Started TestApplicationTests in 1.131 seconds (JVM running for 5.525)
before
test hello 1
after
before
test hello 2
after

二 MockMvc

1 perform方法其實(shí)只是為了構(gòu)建一個(gè)請(qǐng)求,并且返回ResultActions實(shí)例,該實(shí)例則是可以獲取到請(qǐng)求的返回內(nèi)容。

2 MockMvcRequestBuilders該抽象類則是可以構(gòu)建多種請(qǐng)求方式,如:Post、Get、Put、Delete等常用的請(qǐng)求方式,其中參數(shù)則是我們需要請(qǐng)求的本項(xiàng)目的相對(duì)路徑,/則是項(xiàng)目請(qǐng)求的根路徑。

3 param方法用于在發(fā)送請(qǐng)求時(shí)攜帶參數(shù),當(dāng)然除了該方法還有很多其他的方法,大家可以根據(jù)實(shí)際請(qǐng)求情況選擇調(diào)用。

4 andReturn方法則是在發(fā)送請(qǐng)求后需要獲取放回時(shí)調(diào)用,該方法返回MvcResult對(duì)象,該對(duì)象可以獲取到返回的視圖名稱、返回的Response狀態(tài)、獲取攔截請(qǐng)求的攔截器集合等。

5 我們?cè)谶@里就是使用到了第4步內(nèi)的MvcResult對(duì)象實(shí)例獲取的MockHttpServletResponse對(duì)象從而才得到的Status狀態(tài)碼。

6 同樣也是使用MvcResult實(shí)例獲取的MockHttpServletResponse對(duì)象從而得到的請(qǐng)求返回的字符串內(nèi)容?!究梢圆榭磖est返回的json數(shù)據(jù)】

7 使用Junit內(nèi)部驗(yàn)證類Assert判斷返回的狀態(tài)碼是否正常為200

8 判斷返回的字符串是否與我們預(yù)計(jì)的一樣。

要測(cè)試 Spring MVC 控制器是否正常工作,您可以使用@WebMvcTest annotation。 @WebMvcTest將 auto-configure Spring MVC 基礎(chǔ)架構(gòu)并將掃描的 beans 限制為@Controller,@ControllerAdvice,@JsonComponent,F(xiàn)ilter,WebMvcConfigurer和HandlerMethodArgumentResolver。使用此 annotation 時(shí),不會(huì)掃描常規(guī)@Component beans。

@WebMvcTest通常僅限于一個(gè)控制器,并與@MockBean結(jié)合使用。

@WebMvcTest也 auto-configures MockMvc。 Mock MVC 提供了一種快速測(cè)試 MVC 控制器的強(qiáng)大方法,無需啟動(dòng)完整的 HTTP 服務(wù)器。

您也可以通過@AutoConfigureMockMvc注釋非@WebMvcTest(e.g. SpringBootTest)auto-configure MockMvc。

import org.junit.*;
import org.junit.runner.*;
import org.springframework.beans.factory.annotation.*;
import org.springframework.boot.test.autoconfigure.web.servlet.*;
import org.springframework.boot.test.mock.mockito.*;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.BDDMockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@RunWith(SpringRunner.class)
@WebMvcTest(UserVehicleController.class)
public class MyControllerTests {

  @Autowired
  private MockMvc mvc;

  @MockBean
  private UserVehicleService userVehicleService;

  @Test
  public void testExample() throws Exception {
    given(this.userVehicleService.getVehicleDetails("sboot"))
        .willReturn(new VehicleDetails("Honda", "Civic"));
    this.mvc.perform(get("/sboot/vehicle").accept(MediaType.TEXT_PLAIN))
        .andExpect(status().isOk()).andExpect(content().string("Honda Civic"));
  }
}

如果需要配置 auto-configuration 的元素(對(duì)于應(yīng)用 servlet 過濾器的 example),可以使用@AutoConfigureMockMvc annotation 中的屬性。

如果您使用 HtmlUnit 或 Selenium,auto-configuration 還將提供WebClient bean and/or a WebDriver bean。這是一個(gè)使用 HtmlUnit 的 example:

import com.gargoylesoftware.htmlunit.*;
import org.junit.*;
import org.junit.runner.*;
import org.springframework.beans.factory.annotation.*;
import org.springframework.boot.test.autoconfigure.web.servlet.*;
import org.springframework.boot.test.mock.mockito.*;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.BDDMockito.*;

@RunWith(SpringRunner.class)
@WebMvcTest(UserVehicleController.class)
public class MyHtmlUnitTests {

  @Autowired
  private WebClient webClient;

  @MockBean
  private UserVehicleService userVehicleService;

  @Test
  public void testExample() throws Exception {
    given(this.userVehicleService.getVehicleDetails("sboot"))
        .willReturn(new VehicleDetails("Honda", "Civic"));
    HtmlPage page = this.webClient.getPage("/sboot/vehicle.html");
    assertThat(page.getBody().getTextContent()).isEqualTo("Honda Civic");
  }

}

默認(rèn)情況下 Spring Boot 會(huì)將WebDriver beans 放在一個(gè)特殊的“范圍”中,以確保在每次測(cè)試后退出驅(qū)動(dòng)程序,并注入新實(shí)例。如果您不想要此行為,可以將@Scope("singleton")添加到WebDriver @Bean定義中。

測(cè)試

@RunWith(SpringRunner.class) //底層用junit SpringJUnit4ClassRunner
//@SpringBootTest(classes={TestApplicationTests.class}) //啟動(dòng)整個(gè)springboot工程
//@AutoConfigureMockMvc 
@WebMvcTest(TestController.class)
public class MockMvcTestDemo {  
  @Autowired
  private MockMvc mockMvc;  
  @Test
  public void apiTest() throws Exception {  
    MvcResult mvcResult = mockMvc.perform( MockMvcRequestBuilders.get("/test/hello") ).
        andExpect( MockMvcResultMatchers.status().isOk() ).andReturn();
    int status = mvcResult.getResponse().getStatus();
    System.out.println(status);
    
     String responseString = mockMvc.perform( MockMvcRequestBuilders.get("/test/hello") ).
        andExpect( MockMvcResultMatchers.status().isOk() ).andDo(print())     //打印出請(qǐng)求和相應(yīng)的內(nèi)容
     .andReturn().getResponse().getContentAsString();
     System.out.println(responseString);   
  } 
}
@RestController
public class TestController {
  
  @RequestMapping("/test/hello")
  public String test() {
    return "hello";
  }
}

結(jié)果:

2019-10-28 22:02:18.022 INFO 5736 --- [      main] com.example.demo.MockMvcTestDemo     : Started MockMvcTestDemo in 2.272 seconds (JVM running for 3.352)

MockHttpServletRequest:
   HTTP Method = GET
   Request URI = /test/hello
    Parameters = {}
     Headers = []
       Body = <no character encoding set>
  Session Attrs = {}

Handler:
       Type = com.example.demo.web.TestController
      Method = public java.lang.String com.example.demo.web.TestController.test()

Async:
  Async started = false
   Async result = null

Resolved Exception:
       Type = null

ModelAndView:
    View name = null
       View = null
      Model = null

FlashMap:
    Attributes = null

MockHttpServletResponse:
      Status = 200
  Error message = null
     Headers = [Content-Type:"text/plain;charset=UTF-8", Content-Length:"5"]
   Content type = text/plain;charset=UTF-8
       Body = hello
  Forwarded URL = null
  Redirected URL = null
     Cookies = []
hello

springboot是什么

springboot一種全新的編程規(guī)范,其設(shè)計(jì)目的是用來簡(jiǎn)化新Spring應(yīng)用的初始搭建以及開發(fā)過程,SpringBoot也是一個(gè)服務(wù)于框架的框架,服務(wù)范圍是簡(jiǎn)化配置文件。

看完上述內(nèi)容,你們對(duì)怎么在SpringBoot2中實(shí)現(xiàn)單元測(cè)試有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI