国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

單元測試編寫最佳實踐(ChatGPT+Mockito+JUnit)

這篇具有很好參考價值的文章主要介紹了單元測試編寫最佳實踐(ChatGPT+Mockito+JUnit)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

背景

基于 springboot 微服務(wù)架構(gòu)給單元測試帶來的問題:

  1. springboot 單元測試啟動家長過程非常緩慢,后期服務(wù)啟動達到分鐘級,非常影響效率
  2. 服務(wù)之間相互依賴非常嚴重,單元測試的運行非常依賴其它服務(wù)穩(wěn)定性
  3. 第三方服務(wù)和中間件,測試過程產(chǎn)生大量垃圾數(shù)據(jù),污染環(huán)境,非常笨重,甚至產(chǎn)生資損。

解決辦法

采用 EasyMock, PowerMock,Mockito 等mock 框架, 屏蔽外部依賴,還原單元測試本身。

Mockito使用

由于spring-boot-starter-test 默認集成了 Mockito的依賴,本文優(yōu)先介紹 Mockito框架的使用。

依賴

一般不需要手動指定

        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>3.3.3</version>
        </dependency>

導(dǎo)入

導(dǎo)入常用靜態(tài)方法

import static org.mockito.Mockito.*;
import static org.junit.Assert.*;

模擬對象

Mock 對象的創(chuàng)建

語法: mock(class or interface)

用例:

OrderService orderService = mock(OrderService.class);

設(shè)置預(yù)期返回值

語法: when(mock.someMethod()).thenReturn(value)

用例:

when(productService.getById(1L)).thenReturn(new Product(1L,"mate50", new BigDecimal("9000")));

驗證被測試類方法

語法: verify(mock).someMethod(…),verify(mock,times(integer)).someMethod(…)

用例:

verify(orderMapper).insert(any(Order.class));
verify(stockService, times(2)).deduct(anyLong(), eq(1));

配合注解使用

語法: @Mock, mock 一個對象

語法: @InjectMocks , 依賴注入 mock對象

用例:

    /**
     * orderMapper, stockService等為 OrderServiceImpl的依賴對象.
     */
    @InjectMocks
    private OrderService orderService = new OrderServiceImpl(); 

    @Mock
    private OrderMapper orderMapper;

    @Mock
    private StockService stockService;

    @Mock
    private AmountService amountService;

    @Mock
    private ProductService productService;

完整案列

    @Test
    public void testSubmitOrder() {
        Long userId = 1L;
        List<Product> productList = Lists.newArrayList(
                new Product(1L, 1),
                new Product(2L, 1)
        );

        // 模擬productService.getById方法,返回一個Product對象
        when(productService.getById(1L)).thenReturn(new Product(1L,"mate50", new BigDecimal("9000")));
        when(productService.getById(2L)).thenReturn(new Product(2L,"充電寶", new BigDecimal("120")));

        boolean result = orderService.submitOrder(userId, productList);

        // submitOrder 驗證返回結(jié)果為true
        assertTrue(result);

        // 驗證stockService.deduct方法被調(diào)用了2次
        verify(stockService, times(2)).deduct(anyLong(), eq(1));

        // 驗證orderMapper.insert方法被調(diào)用了1次
        verify(orderMapper, times(1)).insert(any(Order.class));
    }

使用codeGPT 生成單元測試

prompt: Write JUnit Tests for the following code by using java, use mockito, use Chinese comment:

單元測試編寫最佳實踐(ChatGPT+Mockito+JUnit),java,測試,junit,單元測試,java

單元測試編寫最佳實踐(ChatGPT+Mockito+JUnit),java,測試,junit,單元測試,java

完整代碼

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.*;

@RunWith(MockitoJUnitRunner.class)
public class OrderServiceTest {

    @Mock
    private ProductService productService;

    @Mock
    private StockService stockService;

    @Mock
    private OrderMapper orderMapper;

    @InjectMocks
    private OrderService orderService;

    @Test
    public void testSubmitOrder() {
        // given
        List<Product> products = Arrays.asList(
                new Product(1L, "product1", BigDecimal.valueOf(10), 2),
                new Product(2L, "product2", BigDecimal.valueOf(20), 1)
        );
        when(productService.getById(1L)).thenReturn(new Product(1L, "product1", BigDecimal.valueOf(10), 10));
        when(productService.getById(2L)).thenReturn(new Product(2L, "product2", BigDecimal.valueOf(20), 10));

        // when
        boolean result = orderService.submitOrder(123L, products);

        // then
        assertEquals(true, result);
        verify(productService, times(2)).getById(anyLong());
        verify(stockService, times(3)).deduct(anyLong(), anyInt());
        verify(orderMapper).insert(any(Order.class));
    }
}

結(jié)論:通過觀察,gpt 生成的單元測試跟手動寫的單元測試非常相近,幾乎直接可以使用。



一點心得

不要去糾結(jié)GPT 哪方面做的不好,要多思考,利用GPT能為我們做什么。文章來源地址http://www.zghlxwxcb.cn/news/detail-700646.html

到了這里,關(guān)于單元測試編寫最佳實踐(ChatGPT+Mockito+JUnit)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Junit5+Mockito單元測試詳解

    Junit5+Mockito單元測試詳解

    1.宏觀層面:AIR原則 A:Automatic(自動化) 全自動執(zhí)行,輸出結(jié)果無需人工檢查,而是通過斷言驗證。 I:Independent(獨立性) 分層測試,各層之間不相互依賴。 R:Repeatable(可重復(fù)) 可重復(fù)執(zhí)行,不受外部環(huán)境( 網(wǎng)絡(luò)、服務(wù)、中間件等)影響。 2.微觀層面:BCDE原則 B: Bord

    2024年01月17日
    瀏覽(33)
  • Junit4 + Mockito進行單元測試實戰(zhàn)案例

    Junit4 + Mockito進行單元測試實戰(zhàn)案例

    ? 實戰(zhàn)代碼案例: ??????????? 注意:idea2021.3.3之前的版本都搜索不到這個插件。 使用TestMe自動生成單元測試代碼: 不是自動化執(zhí)行的單元測試都是無意義的,項目中那么多單測,難道一個一個點嗎? 引入maven-surefire-plugin插件用于自動化執(zhí)行單測。 include里表

    2024年02月16日
    瀏覽(21)
  • SpringBoot單元測試--Mockito+Junit5框架使用

    SpringBoot單元測試--Mockito+Junit5框架使用

    作為程序員為了提前發(fā)現(xiàn)代碼bug,優(yōu)化代碼; 通常我們寫完某個功能模塊代碼后都需要寫單元測試對代碼塊進行測試(特別是敏捷開發(fā)中);Java項目最常用的單元測試框架即為Junit(目前最新版本為Junit5),SpringBoot本身也整合了該框架。在寫單元測試時代碼塊中的調(diào)到第三方接口方

    2024年02月02日
    瀏覽(23)
  • 深度揭秘JUnit5與Mockito的單元測試神秘面紗

    深度揭秘JUnit5與Mockito的單元測試神秘面紗

    在今天的學習中,我們將深入研究 JUnit 和Mockito,這是 Java 開發(fā)中最強大的 單元測試 工具之一。通過學習如何編寫清晰、高效的單元測試,我們將揭開單元測試的神秘面紗,助力你在項目中寫出更健壯的代碼。 提示: 今天的代碼是在第九天代碼的基礎(chǔ)上進行開發(fā),我們將為

    2024年02月02日
    瀏覽(33)
  • SpringBoot 實戰(zhàn):JUnit5+MockMvc+Mockito 做好單元測試

    SpringBoot 實戰(zhàn):JUnit5+MockMvc+Mockito 做好單元測試

    因為繼承了 spring-boot-starter-parent ,所以我們依賴的 spring-boot-starter-test 不需要寫具體的版本,可以直接集成父級的版本定義。其中, spring-boot-starter-web 是用于提供 REST API 的 web 容器, spring-boot-starter-test 可以提供各種測試框架的, spring-boot-maven-plugin 是將 SpringBoot 應(yīng)用打包為

    2024年04月15日
    瀏覽(28)
  • Spring Boot使用JUnit和Mockito進行Service層單元測試

    ??在平時的開發(fā)當中,一個項目往往包含了大量的方法,可能有成千上萬個。如何去保證這些方法產(chǎn)生的結(jié)果是我們想要的呢?那么在SpringBoot項目中我們是如何對Service層的方法進行測試的呢? ??單元測試是一種軟件測試方法,用于測試代碼的最小可測試單元。在Java開發(fā)

    2024年02月03日
    瀏覽(23)
  • 基于Junit4+Mockito+PowerMock實現(xiàn)Controller+Service的單元測試

    基于Junit4+Mockito+PowerMock實現(xiàn)Controller+Service的單元測試

    一 導(dǎo)入的依賴 二 依賴版本 三 controller測試示例代碼 ? ? ? controller ? ? ? ? controllerTest ? ? ? ? 測試結(jié)果:覆蓋率100% ? ? ? ? 帶異常的Controller ? ? ? ? 帶異常提示的ControllerTest ? ? ? ? 測試結(jié)果,覆蓋率100% ? 三 service測試示例代碼 ? ? ? ? service ? ? ? ? serviceTest ???

    2024年02月14日
    瀏覽(28)
  • spring boot 單元測試JUnit5使用Mockito模擬Mock數(shù)據(jù)調(diào)用

    spring boot 單元測試JUnit5使用Mockito模擬Mock數(shù)據(jù)調(diào)用 好大一批新用法,大家靜下心來好好看看吧 1. spring boot 使用 Mockito.when().thenReturn()模擬返回值 Mockito 是一種 Java mock 框架,他主要就是用來做 mock 測試的,他可以模擬任何 Spring 管理的 bean、模擬方法的返回值、模擬拋出異?!?/p>

    2024年02月15日
    瀏覽(31)
  • 使用Mockito針對多線程場景編寫單元測試

    Mockito是一個Java的Mocking框架,主要用于編寫單元測試。針對多線程編程的單元測試,可以使用Mockito的一些特性和技巧來完成。? Mockito支持異步調(diào)用技術(shù),可以使用Mockito.when().thenReturnAsync()方法來模擬異步調(diào)用的返回值。這樣可以模擬多線程編程的情況。 例如,假設(shè)有一個異

    2024年02月09日
    瀏覽(27)
  • springboot項目使用Junit5 + mockito + jacoco 實現(xiàn)單元測試以及代碼覆蓋率檢查

    在創(chuàng)建springboot項目時會默認添加spring-boot-starter-test依賴,其中已經(jīng)包含了junit、mockito依賴,根據(jù)springboot版本的不同junit和mockito的版本也會有所不同 先說一下各自功能: junit只說一點,junt4和junit5的注解不同,使用方式略有差異,其他不贅述了,基本用法都懂。 mockito是mock的

    2023年04月23日
    瀏覽(33)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包