SpringBoot項(xiàng)目創(chuàng)建單元測(cè)試的流程步驟
前言
在日常開發(fā)的過程中,對(duì)自己的代碼進(jìn)行單元測(cè)試是個(gè)非常重要的過程,一方面可以最小范圍的針對(duì)一個(gè)方法進(jìn)行測(cè)試,提高測(cè)試的簡(jiǎn)便性以及測(cè)試的成本,不用啟動(dòng)這個(gè)項(xiàng)目。另一方面,做好單元測(cè)試能降低代碼的BUG率。本篇文章主要是為了總結(jié)一下如何優(yōu)雅的在Springboot項(xiàng)目中使用單元測(cè)試去測(cè)試功能。
一、SpringBoot單元測(cè)試的使用
1.1 引入依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
1.2 創(chuàng)建單元測(cè)試類
如果使用的開發(fā)工具為IntelliJ IDEA,點(diǎn)擊進(jìn)入方法,鼠標(biāo)右鍵

點(diǎn)擊Generate然后選擇Test

選擇好之后點(diǎn)擊Ok就創(chuàng)建好一個(gè)測(cè)試類了。

然后在測(cè)試類上添加@SpringBootTest注解,需要測(cè)試的方法上已經(jīng)有@Test注解了 。點(diǎn)擊方法左側(cè)的三角形即可運(yùn)行單元測(cè)試方法。
二、Spring Boot使用Mockito進(jìn)行單元測(cè)試
Mockito可以模擬一個(gè)類或者方法,使用Mockito進(jìn)行單元測(cè)試的話就可以只關(guān)注這一個(gè)待測(cè)試的方法而不用去啟動(dòng)整個(gè)項(xiàng)目。項(xiàng)目依賴很多環(huán)境,比如中間件、數(shù)據(jù)庫(kù)等,如果使用第一種方法進(jìn)行測(cè)試的話,則這些環(huán)境都要準(zhǔn)備好。
2.1 Mockito中經(jīng)常使用的注解以及注解的作用
- @Mock:用于創(chuàng)建被mock的對(duì)象實(shí)例。添加了@Mock注解的對(duì)象中的方法都需要mock出來(lái),而不是調(diào)用對(duì)象本來(lái)的方法
- @Spy:創(chuàng)建保留原對(duì)象中的方法的對(duì)象。與@Mock注解不同的是,@Spy注解會(huì)保留原對(duì)象的行為,除了被特別標(biāo)記的方法,其他的方法都會(huì)執(zhí)行原有的代碼
- @InjectMocks:用于創(chuàng)建需要注入被Mock對(duì)象的類實(shí)例。例如:Service中注入了一個(gè)Dao,需要測(cè)試的Service中的方法使用了Dao,這個(gè)Dao上面添加了@Mock注解。則測(cè)試類中的Service就需要添加@InjectMocks注解。
- @Captor:用于捕獲方法調(diào)用的參數(shù),方便進(jìn)行進(jìn)一步的斷言和校驗(yàn)
- @MockBean:用于創(chuàng)建Spring Bean的Mock對(duì)象,主要用于集成測(cè)試。在進(jìn)行集成測(cè)試時(shí),有時(shí)需要使用Spring容器中的Bean進(jìn)行測(cè)試,但是又不希望與其他服務(wù)產(chǎn)生依賴關(guān)系。這時(shí)可以使用@MockBean注解,創(chuàng)建一個(gè)Spring Bean的Mock對(duì)象。
- @MockitoSettings:用于設(shè)置Mockito框架的全局設(shè)置。在進(jìn)行單元測(cè)試時(shí),有時(shí)需要設(shè)置Mockito框架的一些全局設(shè)置,例如默認(rèn)的返回值等。這時(shí)可以使用@MockitoSettings注解來(lái)設(shè)置這些全局配置。
了解完了Mockito常使用的一些注解之后,下面就開始對(duì)各種情況的Mock
2.2 使用Mockito測(cè)試類中的方法
@SpringBootTest
public class ProductImageServiceImplMockito {
@Mock
private ProductImageMapper productImageMapper;
@InjectMocks
private ProductImageServiceImpl productImageService;
@BeforeEach
public void setup() {
MockitoAnnotations.openMocks(this);
}
@Test
public void testGet() {
ProductImage productImage = new ProductImage();
productImage.setId(1l);
productImage.setImageUrl("mockUrl");
// mock方法的邏輯
when(productImageMapper.selectById(1l)).thenReturn(productImage);
ProductImage image = productImageService.getByImageId(1l);
assertEquals("mockUrl", image.getImageUrl());
}
}在Mapper上面添加了@Mock注解,則Mapper中的方法都是mock的,這里mock了selectById方法。
2.3 使用Mockito測(cè)試Controller層的方法
// Controller層代碼
@RestController
@RequestMapping("/test")
public class ProductImageController {
@Autowired
private ProductImageServiceImpl productImageService;
@GetMapping("/productImage/{id}")
public ProductImage getProductById(@PathVariable("id") Long id) {
return productImageService.getByImageId(id);
}
}
// 測(cè)試方法代碼
@WebMvcTest(ProductImageController.class)
public class ProductImageServiceImplMockitoV2 {
@MockBean
private ProductImageServiceImpl productImageService;
@Autowired
private MockMvc mockMvc;
@Test
public void test() throws Exception {
ProductImage productImage = new ProductImage();
productImage.setId(1l);
productImage.setImageUrl("mockUrl");
when(productImageService.getByImageId(1l)).thenReturn(productImage);
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/test/productImage/1"))
.andExpect(status().isOk())
.andReturn();
String contentAsString = mvcResult.getResponse().getContentAsString();
}
}直接模擬發(fā)送http請(qǐng)求到Controller的API接口,并調(diào)用@MockBean中mock出來(lái)的方法
2.4 mock測(cè)試其它場(chǎng)景
還有很多場(chǎng)景,這里就不一一列舉了,直接參考文章《在Spring Boot環(huán)境中使用Mockito進(jìn)行單元測(cè)試》
總結(jié)
本文介紹了一些單元測(cè)試的方法,在日常開發(fā)中應(yīng)該避免使用main方法測(cè)試的方式進(jìn)行測(cè)試,因?yàn)閙ain方法既無(wú)法模擬項(xiàng)目的環(huán)境,而且又受靜態(tài)方法的影響只能調(diào)用靜態(tài)方法。還有一些其它的測(cè)試工具,錄入yapi、easymock等也可以進(jìn)行測(cè)試使用。
以上就是SpringBoot項(xiàng)目創(chuàng)建單元測(cè)試的流程步驟的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot創(chuàng)建單元測(cè)試的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java高級(jí)特性之反射機(jī)制實(shí)例詳解
這篇文章主要介紹了Java高級(jí)特性之反射機(jī)制,結(jié)合實(shí)例形式詳細(xì)分析了Java反射機(jī)制原理、功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-08-08
Java?SpringBoot集成文件之如何使用POI導(dǎo)出Word文檔
這篇文章主要介紹了Java?SpringBoot集成文件之如何使用POI導(dǎo)出Word文檔,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08
SpringBoot靜態(tài)資源CSS等修改后再運(yùn)行無(wú)效的解決
這篇文章主要介紹了SpringBoot靜態(tài)資源CSS等修改后再運(yùn)行無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Fluent Mybatis如何做到代碼邏輯和sql邏輯的合一
對(duì)比原生Mybatis, Mybatis Plus或者其他框架,F(xiàn)luentMybatis提供了哪些便利呢?很多朋友對(duì)這一問題不是很清楚,今天小編給大家?guī)?lái)一篇教程關(guān)于Fluent Mybatis如何做到代碼邏輯和sql邏輯的合一,一起看看吧2021-08-08
springBoot之如何獲取接口請(qǐng)求數(shù)據(jù)和返回?cái)?shù)據(jù)實(shí)現(xiàn)日志
這篇文章主要介紹了springBoot之如何獲取接口請(qǐng)求數(shù)據(jù)和返回?cái)?shù)據(jù)實(shí)現(xiàn)日志問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
SpringBoot利用可視化服務(wù)管理腳本部署應(yīng)用
在SpringBoot應(yīng)用的生產(chǎn)環(huán)境部署中,傳統(tǒng)的手動(dòng)啟停服務(wù)方式不僅效率低下,還容易出錯(cuò),所以本文將分享一個(gè)功能強(qiáng)大的可視化服務(wù)管理腳本,讓SpringBoot應(yīng)用的部署和運(yùn)維變得簡(jiǎn)單高效2025-08-08

