单元测试编写最佳实践(ChatGPT+Mockito+JUnit)

这篇具有很好参考价值的文章主要介绍了单元测试编写最佳实践(ChatGPT+Mockito+JUnit)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

基于 springboot 微服务架构给单元测试带来的问题:

  1. springboot 单元测试启动家长过程非常缓慢,后期服务启动达到分钟级,非常影响效率
  2. 服务之间相互依赖非常严重,单元测试的运行非常依赖其它服务稳定性
  3. 第三方服务和中间件,测试过程产生大量垃圾数据,污染环境,非常笨重,甚至产生资损。

解决办法

采用 EasyMock, PowerMock,Mockito 等mock 框架, 屏蔽外部依赖,还原单元测试本身。

Mockito使用

由于spring-boot-starter-test 默认集成了 Mockito的依赖,本文优先介绍 Mockito框架的使用。

依赖

一般不需要手动指定

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

导入

导入常用静态方法

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

模拟对象

Mock 对象的创建

语法: mock(class or interface)

用例:

OrderService orderService = mock(OrderService.class);

设置预期返回值

语法: 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 验证返回结果为true
        assertTrue(result);

        // 验证stockService.deduct方法被调用了2次
        verify(stockService, times(2)).deduct(anyLong(), eq(1));

        // 验证orderMapper.insert方法被调用了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));
    }
}

结论:通过观察,gpt 生成的单元测试跟手动写的单元测试非常相近,几乎直接可以使用。



一点心得

不要去纠结GPT 哪方面做的不好,要多思考,利用GPT能为我们做什么。文章来源地址https://www.toymoban.com/news/detail-700646.html

到了这里,关于单元测试编写最佳实践(ChatGPT+Mockito+JUnit)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Junit5+Mockito单元测试详解

    1.宏观层面:AIR原则 A:Automatic(自动化) 全自动执行,输出结果无需人工检查,而是通过断言验证。 I:Independent(独立性) 分层测试,各层之间不相互依赖。 R:Repeatable(可重复) 可重复执行,不受外部环境( 网络、服务、中间件等)影响。 2.微观层面:BCDE原则 B: Bord

    2024年01月17日
    浏览(37)
  • Junit4 + Mockito进行单元测试实战案例

    ​ 实战代码案例: ​​​​​​​​​​​ 注意:idea2021.3.3之前的版本都搜索不到这个插件。 使用TestMe自动生成单元测试代码: 不是自动化执行的单元测试都是无意义的,项目中那么多单测,难道一个一个点吗? 引入maven-surefire-plugin插件用于自动化执行单测。 include里表

    2024年02月16日
    浏览(42)
  • SpringBoot单元测试--Mockito+Junit5框架使用

    作为程序员为了提前发现代码bug,优化代码; 通常我们写完某个功能模块代码后都需要写单元测试对代码块进行测试(特别是敏捷开发中);Java项目最常用的单元测试框架即为Junit(目前最新版本为Junit5),SpringBoot本身也整合了该框架。在写单元测试时代码块中的调到第三方接口方

    2024年02月02日
    浏览(37)
  • 深度揭秘JUnit5与Mockito的单元测试神秘面纱

    在今天的学习中,我们将深入研究 JUnit 和Mockito,这是 Java 开发中最强大的 单元测试 工具之一。通过学习如何编写清晰、高效的单元测试,我们将揭开单元测试的神秘面纱,助力你在项目中写出更健壮的代码。 提示: 今天的代码是在第九天代码的基础上进行开发,我们将为

    2024年02月02日
    浏览(42)
  • SpringBoot 实战: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 应用打包为

    2024年04月15日
    浏览(39)
  • Spring Boot使用JUnit和Mockito进行Service层单元测试

      在平时的开发当中,一个项目往往包含了大量的方法,可能有成千上万个。如何去保证这些方法产生的结果是我们想要的呢?那么在SpringBoot项目中我们是如何对Service层的方法进行测试的呢?   单元测试是一种软件测试方法,用于测试代码的最小可测试单元。在Java开发

    2024年02月03日
    浏览(44)
  • 基于Junit4+Mockito+PowerMock实现Controller+Service的单元测试

    一 导入的依赖 二 依赖版本 三 controller测试示例代码       controller         controllerTest         测试结果:覆盖率100%         带异常的Controller         带异常提示的ControllerTest         测试结果,覆盖率100%   三 service测试示例代码         service         serviceTest    

    2024年02月14日
    浏览(36)
  • spring boot 单元测试JUnit5使用Mockito模拟Mock数据调用

    spring boot 单元测试JUnit5使用Mockito模拟Mock数据调用 好大一批新用法,大家静下心来好好看看吧 1. spring boot 使用 Mockito.when().thenReturn()模拟返回值 Mockito 是一种 Java mock 框架,他主要就是用来做 mock 测试的,他可以模拟任何 Spring 管理的 bean、模拟方法的返回值、模拟抛出异常…

    2024年02月15日
    浏览(41)
  • 使用Mockito针对多线程场景编写单元测试

    Mockito是一个Java的Mocking框架,主要用于编写单元测试。针对多线程编程的单元测试,可以使用Mockito的一些特性和技巧来完成。  Mockito支持异步调用技术,可以使用Mockito.when().thenReturnAsync()方法来模拟异步调用的返回值。这样可以模拟多线程编程的情况。 例如,假设有一个异

    2024年02月09日
    浏览(32)
  • springboot项目使用Junit5 + mockito + jacoco 实现单元测试以及代码覆盖率检查

    在创建springboot项目时会默认添加spring-boot-starter-test依赖,其中已经包含了junit、mockito依赖,根据springboot版本的不同junit和mockito的版本也会有所不同 先说一下各自功能: junit只说一点,junt4和junit5的注解不同,使用方式略有差异,其他不赘述了,基本用法都懂。 mockito是mock的

    2023年04月23日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包