Spring Boot之單元測試用例總結
關於單元測試
單元測試其核心訴求是將一個複雜的程式進行拆解,分解為若干個獨立的可控子模組來實現測試的可控性。在本節將對Spring Boot中可用的單元測試註解以及用法做一個小結。
通用註解
- @RunWith(SpringRunner.class/SpringJUnit4ClassRunner.class)
使用在測試用例類之上,用來表示當前測試用例需要使用Spring Bean容器進行執行。
上述2個class作用相同。SpringRunner繼承於SpringJUnit4ClassRunner,為其簡寫模式。 - @Test(expected=Exception.class, timeout=xxx)
用來標識單個測試用例,expected表示其需要丟擲的異常,timeout表示其邏輯執行的超時時間。
程式碼示例:
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringRunner;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
@RunWith(SpringRunner.class)
@Slf4j
public class UnitDemoTest {
@Test
public void testCase1() {
log.info("run a single test case");
assertThat("value is not expected", "value", equalTo("value"));
}
}
在上述示例中,展示了一個基本的單元測試所需的內容,assertThat這個是屬於junit類庫的方法,equalTo是屬於hamcrest測試類庫的方法。在測試用例中,需要基於這幾個方法的組合來共同形成一個可用的測試用例。
Controller單元測試
- @WebMvcTest
專門用於測試Controller層的測試註解 - @MockBean
用於mockBean實際中使用的例項,其中方法的執行結果需要使用when/given等方法進行提前設定
首先定義相應的Controller類
@RestController
@Slf4j
public class HomeController {
@GetMapping(value="/home",produces = {MediaType.APPLICATION_JSON_UTF8_VALUE})
public String home(@RequestParam(value = "name", required = false) String name) {
return "hello world," + name;
}
}
單元測試示例:
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HomeController.class)
public class HomeControllerUnitTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testHome() throws Exception{
mockMvc.perform(get("/home?name={name}", "zhangsan").contentType(MediaType.TEXT_PLAIN_VALUE))
.andExpect(status().isOk())
.andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
.andExpect(content().string("hello world,zhangsan"));
}
}
在這個簡單的Web層單元測試中,使用JUnit/Hamcrest等多個類庫的資訊。這裡並沒有體現依賴類的問題,比如如果依賴一個Service會如何來處理。
如果在Controller中依賴了一個Service例項,該如何處理呢?
首先定義一個Service類:
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HomeController.class)
public class HomeControllerUnitTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private GameService gameService;
private String name = "Great";
@Before
public void setUp() {
name = "Great";
given(gameService.doit(name)).willReturn("play Great game");
}
@Test
public void testHome() throws Exception{
mockMvc.perform(get("/home?name={name}", name).contentType(MediaType.TEXT_PLAIN_VALUE))
.andExpect(status().isOk())
.andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
.andExpect(content().string("play Great game"));
}
}
在這裡通過Hamcrest中的given給MockBean中的例項進行賦值操作,指定其反饋的值內容。
總結
這裡主要介紹了基於Controller的單元測試方法。在後續內容中將逐步介紹基於Service、DAO和IntegrationTest測試的方法。
相關文章
- Spring Boot單元測試之服務層測試總結Spring Boot
- Spring Boot之DAO層的單元測試小結Spring Boot
- Spring Boot 單元測試Spring Boot
- Mokito 單元測試與 Spring-Boot 整合測試Springboot
- 使用 Spring Boot 進行單元測試Spring Boot
- Spring Boot乾貨系列:(十二)Spring Boot使用單元測試Spring Boot
- Spring Boot單元和整合測試概述 | rieckpilSpring BootKPI
- Junit 單元測試使用總結
- spring工程的單元測試用例載入配置方法Spring
- 怎樣使用Spring Boot專案的單元測試Spring Boot
- 怎樣使用Spring Boot專案的單元測試?Spring Boot
- 測試 之Java單元測試、Android單元測試JavaAndroid
- 前端單元測試總結及測試工具介紹前端
- 測試開發之單元測試-禪道結合ZTF驅動單元測試執行
- android單元測試遇到問題總結Android
- 軟體工程單元測試作業總結軟體工程
- [Android]單元測試例項Android
- Spring Boot之驗證模組應用總結2Spring Boot
- Angular單元測試如何只執行指定的測試用例,提高測試速度Angular
- 如何寫好測試用例以及go單元測試工具testify簡單介紹Go
- [android]android自動化測試十之單元測試例項Android
- Go 單元測試之mock介面測試GoMock
- Java單元測試之junitJava
- 使用 Spring 進行單元測試Spring
- Spring AOP單元測試綜合指南Spring
- 如何建立自己的Spring Boot Starter併為其編寫單元測試Spring Boot
- iOS開發中的單元測試(三)——URLManager中的測試用例解析iOS
- 如何測試 Flutter 應用? ー 單元測試Flutter
- httprunner(9)執行測試用例的方式總結HTTP
- 單元測試:單元測試中的mockMock
- Java單元測試神器之MockitoJavaMockito
- Java單元測試技巧之PowerMockJavaMock
- Spring-test 單元測試使用示例Spring
- Spring MVC自動化單元測試SpringMVC
- spring boot 整合測試Spring Boot
- Golang之wait.Until 簡單測試用例GolangAI
- Spring Boot(七):spring boot測試介紹Spring Boot
- 開發者測試-採用精準測試工具對Spring Boot應用進行測試Spring Boot