首页 > 编程语言 >使用JUnit进行Java单元测试

使用JUnit进行Java单元测试

时间:2024-07-10 09:32:02浏览次数:18  
标签:Java int calculator 单元测试 public void 测试 JUnit

使用JUnit进行Java单元测试

大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!

单元测试是软件开发过程中至关重要的一部分,能够确保代码的正确性、健壮性和可维护性。JUnit 是一个流行的 Java 单元测试框架,广泛应用于 Java 应用程序的测试。本文将详细介绍如何使用 JUnit 进行 Java 单元测试,包括如何编写测试类、使用断言、测试异常、参数化测试以及集成到构建工具中。

1. 添加JUnit依赖

首先,我们需要在 pom.xml 中添加 JUnit 依赖。以 JUnit 5 为例:

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.7.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>

2. 编写待测试的类

假设我们有一个简单的计算器类,需要对其进行单元测试。

package cn.juwatech.calculator;

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

    public int subtract(int a, int b) {
        return a - b;
    }

    public int multiply(int a, int b) {
        return a * b;
    }

    public int divide(int a, int b) {
        if (b == 0) {
            throw new IllegalArgumentException("Divider cannot be zero");
        }
        return a / b;
    }
}

3. 编写测试类

接下来,我们编写一个测试类,对 Calculator 类的方法进行测试。

package cn.juwatech.calculator;

import org.junit.jupiter.api.*;

import static org.junit.jupiter.api.Assertions.*;

public class CalculatorTest {

    private Calculator calculator;

    @BeforeEach
    public void setUp() {
        calculator = new Calculator();
    }

    @Test
    public void testAdd() {
        assertEquals(5, calculator.add(2, 3));
    }

    @Test
    public void testSubtract() {
        assertEquals(1, calculator.subtract(3, 2));
    }

    @Test
    public void testMultiply() {
        assertEquals(6, calculator.multiply(2, 3));
    }

    @Test
    public void testDivide() {
        assertEquals(2, calculator.divide(4, 2));
    }

    @Test
    public void testDivideByZero() {
        Exception exception = assertThrows(IllegalArgumentException.class, () -> {
            calculator.divide(4, 0);
        });
        assertEquals("Divider cannot be zero", exception.getMessage());
    }
}

4. 断言

JUnit 提供了一组丰富的断言方法,用于验证测试结果。

  • assertEquals(expected, actual): 验证两者是否相等。
  • assertTrue(condition): 验证条件是否为真。
  • assertFalse(condition): 验证条件是否为假。
  • assertNotNull(object): 验证对象不为空。
  • assertNull(object): 验证对象为空。
  • assertThrows(expectedType, executable): 验证执行过程中是否抛出指定类型的异常。

5. 参数化测试

JUnit 5 支持参数化测试,可以使用不同的参数重复运行测试。

package cn.juwatech.calculator;

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

import static org.junit.jupiter.api.Assertions.*;

public class CalculatorParamTest {

    @ParameterizedTest
    @CsvSource({
        "1, 1, 2",
        "2, 3, 5",
        "5, 8, 13"
    })
    public void testAdd(int a, int b, int expected) {
        Calculator calculator = new Calculator();
        assertEquals(expected, calculator.add(a, b));
    }
}

6. 集成到构建工具

我们可以将JUnit测试集成到构建工具中,例如Maven。

pom.xml中配置Surefire插件以运行测试。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
        </plugin>
    </plugins>
</build>

运行mvn test命令来执行测试。

7. 测试覆盖率

使用Jacoco插件来测量测试覆盖率。

pom.xml中添加Jacoco插件配置。

<build>
    <plugins>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.8.5</version>
            <executions>
                <execution>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
                <execution>
                    <id>report</id>
                    <phase>test</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

运行mvn testmvn jacoco:report来生成覆盖率报告。

8. 复杂的测试场景

除了简单的方法测试外,我们还可以测试复杂的业务逻辑和边界条件。例如,对一个用户注册系统进行测试。

package cn.juwatech.user;

public class UserService {
    public boolean registerUser(String username, String password) {
        if (username == null || password == null) {
            throw new IllegalArgumentException("Username or password cannot be null");
        }
        // 假设有一些复杂的业务逻辑
        return true;
    }
}

测试类:

package cn.juwatech.user;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

public class UserServiceTest {

    @Test
    public void testRegisterUser() {
        UserService userService = new UserService();
        assertTrue(userService.registerUser("user1", "pass1"));
    }

    @Test
    public void testRegisterUserWithNullUsername() {
        UserService userService = new UserService();
        assertThrows(IllegalArgumentException.class, () -> {
            userService.registerUser(null, "pass1");
        });
    }

    @Test
    public void testRegisterUserWithNullPassword() {
        UserService userService = new UserService();
        assertThrows(IllegalArgumentException.class, () -> {
            userService.registerUser("user1", null);
        });
    }
}

总结

通过本文,我们详细了解了如何使用JUnit进行Java单元测试,包括如何编写测试类、使用断言、测试异常、参数化测试以及将其集成到构建工具中。掌握这些技巧,可以大大提高代码的质量和维护性,确保在开发过程中及时发现和修复问题。

微赚淘客系统3.0小编出品,必属精品,转载请注明出处!

标签:Java,int,calculator,单元测试,public,void,测试,JUnit
From: https://www.cnblogs.com/szk123456/p/18293193

相关文章

  • 如何在Java中处理JSON数据
    如何在Java中处理JSON数据大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式之一。Java提供了多种库来处理JSON数据,最常用的包括Gson、Jackson和org.json等。在本文中,我们将详细介......
  • 【转】-Java CAS 原理剖析
    JavaCAS原理剖析本文转载来自​卡巴拉的树​的​JavaCAS原理剖析在Java并发中,我们最初接触的应该就是synchronized关键字了,但是synchronized属于重量级锁,很多时候会引起性能问题,volatile也是个不错的选择,但是volatile不能保证原子性,只能在某些场合下使用。像synchronized这......
  • 计算机毕业设计项目:18655 课程题库管理系统(开题答辩+程序定制+全套文案 )上万套实战教
    摘 要随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于课程题库管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了课程题库管理系统,它彻底改变了过去传统的管理方式,不仅使服务管理难度变低了,还提升了管理的灵活性。这种个......
  • 计算机毕业设计项目: node.js 网上购物商城的设计与实现99525(开题答辩+程序定制+全套文
    摘 要随着社会的发展,计算机的优势和普及使得网上购物商城的开发成为必需。网上购物商城主要是借助计算机,通过对首页、站点管理(轮播图、公告栏)用户管理(管理员、注册用户)内容管理(商城资讯、资讯分类)商城管理(商城中心、分类列表、订单列表)等信息进行管理。减少管理员的工作......
  • 计算机毕业设计项目:校园新闻数据化系统的设计与实现 99293(开题答辩+程序定制+全套文案
    目 录摘要1绪论1.1研究目的和意义1.2选题背景和意义1.3系统开发技术的特色1.4springboot框架介绍1.5论文结构与章节安排22校园新闻数据化系统系统分析2.1可行性分析2.2系统流程分析2.2.1数据增加流程2.3.2数据修改流程2.3.3数据删除流程2.3......
  • 精讲:java之多维数组的使用
    一、多维数组简介1.为什么需要二维数组我们看下面这个例子?“        某公司2022年全年各个月份的销售额进行登记。按月份存储,可以使用一维数组。如果改写为按季度为单位存储怎么办呢?        或许现在学习了一维数组的你只能申请四个一维数组去存储每个季......
  • 关于力扣150题目——逆波兰表达式求值Java实现的三种解法
    题目介绍逆波兰表达式是一种后缀表达式,其运算符位于操作数之后。力扣150题目要求我们实现一个函数,计算给定逆波兰表达式的值。本文将介绍三种不同的Java实现方法来解决这个问题。解法一:使用栈这是最直观和常见的解法,使用栈来存储操作数,并在遇到运算符时从栈中弹出操作数......
  • 如何在Java中实现异步任务调度?
    如何在Java中实现异步任务调度?大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代Java应用中,异步任务调度是提升系统性能和响应速度的重要手段。通过异步任务调度,我们可以将一些耗时的任务放在后台处理,从而不阻塞主线程的执行。本文将详细介绍如何在Ja......
  • Java字符串(String、字符串拼接、原理)
    文章目录一、String字符串1.1创建方式【直接赋值、new一个对象】1.1.1使用字符串字面值直接赋值:(1)字符串字面量创建String对象的转换过程(2)一些方法(3)说明1.1.2使用`new`关键字创建字符串对象,将内容赋值给变量:(1)`String`类有多个构造函数,其中一些常用的包括:(2)说明(3)引用的......
  • Java项目:基于SSM框架实现的中小型企业财务管理系统【ssm+B/S架构+源码+数据库+答辩PPT
    一、项目简介本项目是一套基于SSM框架实现的中小型企业财务管理系统包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。项目都经过严格调试,eclipse或者idea确保可以运行!该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值二......