透彻理解并解决Mockito模拟框架的单元测试无法运行的问题

本篇的实例基于Maven

IDE (VS Code) 运行

在VS Code 运行的时候, 不需要在pom.xml 中添加任何插件就可以在测试类中看到如下的绿色按钮,单击就可以运行使用Mockito 注解 @ExtendWith(MockitoExtension.class) 或是 Mockito 代码方式的测试。

  • 不使用注解:

    **

    • Copyright (C) Oscar Chen(XM):
    • Date: 2024-12-07
    • Author: XM
      */
      package com.osxm.test.mock;

    import static org.mockito.Mockito.mock;
    import static org.mockito.Mockito.verify;
    import static org.mockito.Mockito.when;
    import java.util.List;
    import org.junit.jupiter.api.Test;

    public class MockMethodTest {

    复制代码
      @Test
      public void objectMock() {
          List<String> mockedList = mock(List.class); // 创建一个List接口的mock对象
          when(mockedList.get(0)).thenReturn("first");
          mockedList.get(0);
          verify(mockedList).get(0); 
      }

    }

  • 使用注解

    //**

    • Copyright (C) Oscar Chen(XM):
    • Date: 2024-12-01
    • Author: XM
      */
      package com.osxm.test.mock;

    import static org.mockito.Mockito.verify;
    import static org.mockito.Mockito.when;

    import java.util.List;

    import org.junit.jupiter.api.Test;
    import org.junit.jupiter.api.extension.ExtendWith;
    import org.mockito.Mock;
    import org.mockito.junit.jupiter.MockitoExtension;

    @ExtendWith(MockitoExtension.class)
    public class MockitoUsageTest {

    复制代码
      @Mock
      private List<String> mockedList;
    
      @Test
      public void objectMock() {
          when(mockedList.get(0)).thenReturn("first");
          mockedList.get(0);
          verify(mockedList).get(0); 
      }

    }

如果需要调试模式可以右键单击按钮,在弹出菜单选择Debug Test

mvn test 命令行运行的问题

但是在命令行使用 mvn test 命令运行的时候, 却出现了比较奇怪的现象:

  • 普通的JUnit 测试类和方法能正常运行
  • 使用Mockito 的测试类能找到,但是测试方法找不到,如下图所示:

为什么呢? 这里首先要介绍一下 Maven的插件 maven-surefire-plugin。

maven-surefire-plugin

maven-surefire-plugin是Maven的一个插件,主要用于执行Java应用程序中的单元测试。

主要功能包括:

  1. 执行单元测试:maven-surefire-plugin可以自动发现并执行项目中的测试类。它默认使用JUnit来执行测试,但也可以配置为支持其他测试框架,如TestNG。
  2. 报告生成 :该插件提供详细的测试结果报告,包括测试用例的数量、成功/失败/忽略的数量等,这些报告通常以纯文本(.txt)和XML(.xml)格式生成,并保存在项目的target/surefire-reports目录下。
  3. 定制测试执行:maven-surefire-plugin允许用户通过配置来定制测试的执行方式,例如指定特定的测试类或方法进行执行,或者排除某些测试类或方法。

mvn test 运行Mockito 测试的解法

在pom.xml 中添加maven-surefire-plugin 插件:

复制代码
    <build>
       <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.5.2</version>
            </plugin>
        </plugins>
    </build>

再次运行就可以找到Mockito 编写的测试类了。

问题

那么,问题来了:

  1. 为什么VS Code不添加maven-surefire-plugin可以运行单元测试?
  2. 为什么在不添加maven-surefire-plugin的状况下,普通的单元测试可以找到并运行,Mockito 的不行了呢?
    接下来就解惑这两个问题

### 为什么VS Code不添加maven-surefire-plugin可以运行单元测试?

在IDE中导入Maven项目时,IDE通常会自动读取pom.xml文件,并根据其中的配置来设置项目的构建和测试环境。如果pom.xml中没有显式配置maven-surefire-plugin,IDE可能会使用Maven的默认行为来执行测试。

另外, IDE通常还提供了测试运行器功能,允许用户直接运行和调试测试类。这些测试运行器可以与Maven的测试框架集成,从而在不依赖maven-surefire-plugin的情况下执行测试。

所以,对于IDE ,可以不依赖pom.xml 的maven-surefire-plugin 就可以运行测试

为什么在不添加maven-surefire-plugin的状况下,普通的单元测试可以找到并运行,Mockito 的不行了呢?

稍微细心一点就可以看到在显式添加maven-surefire-plugin 的前后的差异:

在pom.xml 显式添加maven-surefire-plugin 之前,使用mvn test 命令其实也使用了maven-surefire-plugin,只是版本比较低 ,是2.12.4 版。

这个原意就是 Maven内置了一个版本的maven-surefire-plugin,即使项目没有配置,也可以使用这个版本来运行单元测试,但是这里的状况,这个版本相对于Mockito 的版本来说,低了, 所以找不到Mockito 的测试。通过添加新版本的

maven-surefire-plugin 就可以解决这个问题。



相关推荐
软件检测小牛玛1 天前
具备软件功能测试资质的机构哪家更权威?山东软件测评机构 中承信安
功能测试·单元测试·软件测试报告·软件测评机构
闻哥1 天前
从测试坏味道到优雅实践:打造高质量单元测试
java·面试·单元测试·log4j·springboot
Warren982 天前
Pytest Fixture 作用域与接口测试 Token 污染问题实战解析
功能测试·面试·单元测试·集成测试·pytest·postman·模块测试
知行合一。。。2 天前
程序中的log4j、stderr、stdout日志
python·单元测试·log4j
测试秃头怪2 天前
面试大厂就靠这份软件测试八股文了【含答案】
自动化测试·软件测试·python·功能测试·面试·职场和发展·单元测试
测试大圣2 天前
软件测试基础知识总结(超全的)
软件测试·python·功能测试·测试工具·职场和发展·单元测试·测试用例
CodeCraft Studio3 天前
【Parasoft案例分享】在 DO-178C 标准下,如何实现航空嵌入式软件测试自动化
单元测试·自动化·静态分析·代码覆盖率·parasoft·do-178c·软件自动化测试
懒羊羊大王&3 天前
软件测试之博客系统项目实战(补充和解析部分)
selenium·单元测试·测试用例·集成测试
真智AI3 天前
用 LLM 辅助生成可跑的 Python 单元测试:pytest + coverage 覆盖率报告(含运行指令与排坑)
python·单元测试·pytest