成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java常用的單元測試框架介紹

開發 測試
本文主要講述java常用的單元測試框架,包括junit5、Mockito、SpringBootTest框架,通過講解各框架常用注解、使用樣例、注意事項,讓大家在開發過程中能夠快速、高效選擇適合自己的單元測試框架。

Part 01、  JUnit5框架 

1.1 Junit5介紹

Junit5需要Java 8或更高版本,和Junit4只是一個單獨的Jar包不同,目前的Junit5組成如下:JUnit5=JUnit Platform+JUnit Jupiter+JUnit Vintage

- JUnit Platform:

是Junit向測試平臺演進,提供平臺功能的模塊,通過JUnit Platform,其他的自動化測試引擎或開發人員自己定制的引擎都可以接入Junit實現對接和執行

- JUnit Jupiter:

這是Junit5的核心,可以看作是承載Junit4原有功能的演進,它包含了很多豐富的新特性來使JUnit自動化測試更加方便、功能更加豐富和強大。

本系列就會重點圍繞Jupiter中的一些特性進行介紹。Jupiter本身也是一個基于Junit Platform的引擎實現。

- JUnit Vintage:

Junit發展了10數年,Junit3和Junit4都積累了大量的用戶,作為新一代框架,這個模塊是對JUnit3,JUnit4版本兼容的測試引擎,使舊版本Junit的自動化測試腳本也可以順暢運行在Junit5下,它也可以看作是基于Junit Platform實現的引擎范例。

1.2 測試實例生命周期介紹

@TestInstance(TestInstance.Lifecycle.PER_CLASS)

* PER_METHOD(默認):JUnit在執行每個測試方法之前創建每個測試類的新實例 

* PER_CLASS:JUnit Jupiter在同一個測試實例上執行所有測試方法,當使用這種模式時,每個測試類將創建一個新的測試實例。因此,如果您的測試方法依賴于存儲在實例變量中的狀態,則可能需要在@BeforeEach或@AfterEach方法中重置該狀態。

1.3 Junit5常用注解介紹

@BeforeAll

JUnit5@BeforeAll注釋是JUnit4中@BeforeClass注釋的替代。它用于表示應在當前測試類中的所有測試方法之前執行的帶的方法。 

備注:@BeforeAll注釋的方法必須是靜態方法,否則會報運行時錯誤。

@BeforeEach

JUnit5@BeforeEach注釋替代了JUnit4中的@Before注釋。被注釋的方法會在當前類中的每個Test方法之前執行。也就是說有多少個test這個方法就會執行多少次。

備注:@BeforeEach注釋的方法一定不能是靜態方法,否則會報發運行時錯誤。

@AfterEach

JUnit5@AfterEach注釋是JUnit4中@After注釋的替換。它用于表示應在當前類中的每個@Test方法之后執行帶注釋的方法。

@AfterAll 

JUnit5@AfterAll注釋是JUnit4中@AfterClass注釋的替換。它用于表示應在當前測試類中的所有測試之后執行帶注釋的方法。

備注:@AfterAll注釋的方法必須是靜態方法,否則會報運行時錯誤。

Junit5當中使用@BeforeEach替換了@Before使用 @AfterEach替換了@After

@Disabled可以用于不運行某些test的場景。

@Tag可以用于將測試分類。

JUnit Jupiter支持下列注解,用于配置測試和擴展框架。

所有核心注解位于junit-jupiter-api模塊中的org.junit.jupiter.api包中。

圖片

圖片

Part 02、  spring-boot-test框架 

2.1 版本迭代

在JUnit4中,自定義框架通常意味著使用@RunWith注釋來指定一個自定義的運行器。使用多個運行器是有問題的。

Junit5在Spring boot 2.1.x之前,@SpringBootTest需要配合@ExtendWith(SpringExtension.class)才能正常工作的。

而在Spring boot 2.1.x之后,我們查看@SpringBootTest 的代碼會發現,其中已經組合了@ExtendWith(SpringExtension.class),因此,無需在進行該注解的使用了。

Spring Boot 2.2.0版本開始引入JUnit5作為單元測試默認庫

Junit5中包含JUnit Vintage:這個模塊是兼容JUnit3、JUnit4版本的測試引擎,使得舊版本的自動化測試也可以在JUnit5下正常運行。防止使用舊的junit4相關接口,可以進行依賴排除,如下圖:

圖片圖片

SpringBoot 2.4以上版本移除了默認對Vintage的依賴。如果需要兼容JUnit4.x版本,需要自行引入。

圖片圖片

SpringBootTest默認集成了以下功能:

圖片圖片

圖片圖片

備注:JUnit4前移注意事項

圖片圖片

2.2 Spring Boot Test中的主要注解

從功能上講,Spring Boot Test中的注解主要分如下幾類:

圖片圖片

圖片圖片

2.2.1 配置類型的注解

使用@SpringBootApplication啟動測試或者生產代碼,被@TestComponent描述的Bean會自動被排除掉。如果不是則需要向@SpringBootApplication添加TypeExcludeFilter。

圖片圖片

2.2.2 mock類型的注解

@MockBean和@SpyBean這兩個注解,在mockito框架中本來已經存在,且功能基本相同。Spring Boot Test又定義一份重復的注解,目的在于使MockBean和SpyBean被ApplicationContext管理,從而方便使用。MockBean和SpyBean功能非常相似,都能模擬方法的各種行為。不同之處在于MockBean是全新的對象,跟正式對象沒有關系;而SpyBean與正式對象緊密聯系,可以模擬正式對象的部分方法,沒有被模擬的方法仍然可以運行正式代碼。

@MockBean 只能 mock 本地的代碼——或者說是自己寫的代碼,對于儲存在庫中而且又是以 Bean 的形式裝配到代碼中的類無能為力。

@SpyBean 解決了 SpringBoot 的單元測試中

@MockBean 不能 mock 庫中自動裝配的 Bean 的局限

2.2.3 自動配置類型的注解(@AutoConfigure*)

圖片圖片

這些注解可以搭配@\*Test使用,用于開啟在@\*Test中未自動配置的功能。例如@SpringBootTest和@AutoConfigureMockMvc組合后,就可以注入org.springframework.test.web.servlet.MockMvc。

2.2.3.1 自動配置類型有兩種使用方式

a.在功能測試(即使用@SpringBootTest)時顯示添加。

b.一般在切片測試中被隱式使用,例如@WebMvcTest注解時,隱式添加了@AutoConfigureCache

@AutoConfigureWebMvc

@AutoConfigureMockMvc。

2.2.4 啟動測試類型的注解

所有的@*Test注解都被@BootstrapWith注解,它們可以啟動。

圖片圖片

ApplicationContext,是測試的入口,所有的測試類必須聲明一個@*Test注解。

除了@SpringBootTest之外的注解都是用來進行切面測試的,他們會默認導入一些自動配置。一般情況下,推薦使用@SpringBootTest而非其它切片測試的注解,簡單有效。若某次改動僅涉及特定切片,可以考慮使用切片測試。

2.2.5 常用配置介紹

@SpringBootTest,其中包含的配置項如下:

圖片圖片

@WebEnvironment,其中包含的配置項如下:

圖片圖片

Part 03、  Mockito框架 

3.1 常用的Mockito方法

圖片圖片

圖片圖片

圖片圖片

3.2 Mockito參數適配方法

Mockito.anyString()
Mockito.anyInt()
Mockito.anyLong()
Mockito.anyDouble()
Mockito.anyObject()   表示任何對象
Mockito.any(clazz)     表示任何屬于clazz的對象
Mockito.anyCollection()
Mockito.anyCollectionOf(clazz)
Mockito.anyList(Map, set)
Mockito.anyListOf(clazz)

注:Mockito.anyString() 不能匹配到 null 參數,如果還需要匹配 null,可以使用 Mockito.any()。

Part 04、單元測試樣例 

4.1 Mock redis、kafka方法

方法1:

@SpringBootTest通過@Resource引入對象測試,需要依賴redis環境(會啟動spring boot 容器)

方法2:

//聲明變量
private  AsyncService asyncService;
//需要mock的對象
private StringRedisTemplate stringRedisTemplate;
//創建要測試對象
asyncService = new AsyncServiceImpl();
//mock對象(也可以使用@Mock注解方式)
StringRedisTemplate stringRedisTemplate =
mock(StringRedisTemplate.class,Mockito.RETURNS_DEEP_STUBS);
KafkaProducer kafkaProducer = mock(KafkaProducer.class);
//屬性賦值
ReflectionTestUtils.setField(asyncService,
"stringRedisTemplate", stringRedisTemplate);
ReflectionTestUtils.setField(asyncService,
"kafkaProducer", kafkaProducer);
@Test
@DisplayName("mock redis、kafka 測試")
public void redisTest() {
when(stringRedisTemplate.opsForValue().get(anyString())).thenReturn("2222");
   Assertions.assertTrue(asyncService.testRedis("真實方法調用"));
}

4.2 Spring Security模擬登錄方法

<dependency> 
 <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-test</artifactId> 
    <version>5.6.5</version> 
    <scope>test</scope> 
</dependency>

注解:@WithMockUser(roles = "ROOT", username = "root") 

4.3 遠程接口調用方法(Controller入口測試)

  • MockMVC的基本步驟

(1) mockMvc.perform執行一個請求。

(2) MockMvcRequestBuilders.get("XXX")構造一個請求。

(3) ResultActions.param添加請求傳值

(4) ResultActions.accept()設置返回類型

(5) ResultActions.andExpect添加執行完成后的斷言。

(6) ResultActions.andDo添加一個結果處理器,表示要對結果做點什么事情,比如處使用print()輸出整個響應結果信息。

(7) ResultActions.andReturn表示執行完成后返回相應的結果。

責任編輯:龐桂玉 來源: 移動Labs
相關推薦

2017-01-14 23:42:49

單元測試框架軟件測試

2011-07-04 18:16:42

單元測試

2022-05-12 09:37:03

測試JUnit開發

2022-04-27 08:17:07

OCMock單元測試集成

2024-10-16 16:09:32

2009-06-01 10:47:32

jboss seam例jboss seam開jboss seam

2010-01-15 14:10:42

C++單元測試

2009-08-19 09:00:48

單元測試框架自動化測試

2010-08-27 09:11:27

Python單元測試

2009-09-01 16:45:00

C#單元測試工具

2023-07-26 08:58:45

Golang單元測試

2011-05-16 16:52:09

單元測試徹底測試

2017-01-14 23:26:17

單元測試JUnit測試

2017-01-16 12:12:29

單元測試JUnit

2011-06-14 15:56:42

單元測試

2020-08-18 08:10:02

單元測試Java

2024-04-26 11:14:34

C#單元測試框架

2021-05-05 11:38:40

TestNGPowerMock單元測試

2017-03-23 16:02:10

Mock技術單元測試

2020-05-07 17:30:49

開發iOS技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 视频二区| 欧美色综合一区二区三区 | 日韩国产欧美 | 欧美国产精品一区二区三区 | 精品国产综合 | 精品自拍视频 | av中文字幕在线观看 | 在线观看av网站永久 | 我想看国产一级毛片 | 伊人电影院av | 综合精品 | 欧美日韩在线观看视频网站 | 久久精品16 | 精品国产伦一区二区三区观看体验 | 久久久精品一区二区三区 | 日本午夜免费福利视频 | 日本国产精品视频 | av大全在线 | 九九伦理片 | 欧美精品一区二区三区在线播放 | 天天操综合网站 | 国产一区不卡 | 国产一级片 | 欧美日韩国产在线观看 | 欧美成人一区二免费视频软件 | 性色的免费视频 | 国产高潮好爽受不了了夜色 | 999精彩视频| 谁有毛片 | 亚洲欧美中文日韩在线v日本 | 亚洲国产一区二区三区, | 日本精品久久久久久久 | 91视频入口| 999久久久久久久久6666 | 国产美女在线播放 | 精品一区二区三区四区外站 | 亚洲一区二区三区四区五区中文 | 久久精品免费 | 91久久久www播放日本观看 | 成人免费xxxxx在线视频 | 黄色视频a级毛片 |