0

0

如何在 JUnit 中测试代码是否抛出特定异常

碧海醫心

碧海醫心

发布时间:2025-10-04 11:02:41

|

368人浏览过

|

来源于php中文网

原创

如何在 junit 中测试代码是否抛出特定异常

本文旨在介绍如何在 JUnit 中测试代码是否抛出预期的异常,并验证异常的类型和消息。文章详细讲解了使用 try-catch 块进行异常测试的方法,并展示了如何访问异常对象以进行更全面的验证。无论你使用的是哪个版本的 JUnit,都能找到适合你的解决方案。

在编写单元测试时,验证代码在特定情况下是否抛出预期的异常至关重要。JUnit 提供了多种方法来实现这一目标。本文将重点介绍使用 try-catch 块来测试异常,这种方法具有良好的灵活性和可读性。

使用 try-catch 块进行异常测试

这种方法的核心思想是在 try 块中执行可能抛出异常的代码,然后在 catch 块中捕获预期的异常,并进行断言验证。

以下是一个示例,演示如何使用 try-catch 块来测试一个除以零的操作是否抛出 ArithmeticException 异常,并且验证异常消息是否正确:

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

class ExampleTest {

    static class Example {
        public static int divide(int numerator, int denominator) {
            if (denominator == 0) {
                throw new ArithmeticException("Denominator cannot be zero");
            }
            return numerator / denominator;
        }
    }

    @Test
    void testDivideByZero() {
        try {
            Example.divide(10, 0);
            fail("Expected ArithmeticException was not thrown"); // 如果没有抛出异常,则测试失败
        } catch (ArithmeticException e) {
            assertEquals("Denominator cannot be zero", e.getMessage()); // 验证异常消息
        }
    }
}

代码解释:

SuperDesign
SuperDesign

开源的UI设计AI智能体

下载
  1. @Test 注解: 标记该方法为一个测试用例。
  2. try 块: Example.divide(10, 0) 这行代码可能会抛出 ArithmeticException。
  3. fail("Expected ArithmeticException was not thrown"): 如果 Example.divide(10, 0) 没有抛出异常,则会执行这行代码,导致测试失败。这确保了只有在抛出异常时,测试才会继续到 catch 块。
  4. catch (ArithmeticException e) 块: 捕获 ArithmeticException 异常。
  5. assertEquals("Denominator cannot be zero", e.getMessage()): 断言捕获到的异常的消息是否与预期消息 "Denominator cannot be zero" 相匹配。

注意事项:

  • fail() 方法: 在 try 块中调用 fail() 方法非常重要。如果没有抛出预期的异常,fail() 方法会立即导致测试失败,避免了错误的通过。
  • 异常类型: 确保 catch 块捕获的是 预期 的异常类型。捕获错误的异常类型会导致测试无法正确执行。
  • 异常消息: 验证异常消息可以确保异常是由特定原因引起的,并且可以提供更详细的错误信息。

访问异常对象

使用 try-catch 块的另一个优点是可以访问捕获到的异常对象。这使得你可以检查异常的更多属性,而不仅仅是消息。例如,你可以检查异常的堆跟踪,或者访问异常中包含的其他数据。

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

class ExampleTest {

    static class CustomException extends Exception {
        private final int errorCode;

        public CustomException(String message, int errorCode) {
            super(message);
            this.errorCode = errorCode;
        }

        public int getErrorCode() {
            return errorCode;
        }
    }

    static class Example {
        public static void processData(int value) throws CustomException {
            if (value < 0) {
                throw new CustomException("Value cannot be negative", 1001);
            }
            // ... 正常的处理逻辑 ...
        }
    }

    @Test
    void testProcessDataThrowsCustomException() {
        try {
            Example.processData(-5);
            fail("Expected CustomException was not thrown");
        } catch (CustomException e) {
            assertEquals("Value cannot be negative", e.getMessage());
            assertEquals(1001, e.getErrorCode()); // 验证自定义的 errorCode
        }
    }
}

在这个例子中,我们定义了一个自定义的异常 CustomException,它包含一个 errorCode 字段。在测试中,我们不仅验证了异常消息,还验证了 errorCode 的值。

总结

使用 try-catch 块是在 JUnit 中测试异常的一种强大而灵活的方法。它允许你精确控制测试流程,验证异常类型和消息,并访问异常对象以进行更全面的验证。 这种方法适用于各种 JUnit 版本,并且易于理解和使用。记住始终使用 fail() 方法来确保在没有抛出预期异常时测试失败,并仔细选择要捕获的异常类型。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
软件测试常用工具
软件测试常用工具

软件测试常用工具有Selenium、JUnit、Appium、JMeter、LoadRunner、Postman、TestNG、LoadUI、SoapUI、Cucumber和Robot Framework等等。测试人员可以根据具体的测试需求和技术栈选择适合的工具,提高测试效率和准确性 。

439

2023.10.13

java测试工具有哪些
java测试工具有哪些

java测试工具有JUnit、TestNG、Mockito、Selenium、Apache JMeter和Cucumber。php还给大家带来了java有关的教程,欢迎大家前来学习阅读,希望对大家能有所帮助。

299

2023.10.23

Java 单元测试
Java 单元测试

本专题聚焦 Java 在软件测试与持续集成流程中的实战应用,系统讲解 JUnit 单元测试框架、Mock 数据、集成测试、代码覆盖率分析、Maven 测试配置、CI/CD 流水线搭建(Jenkins、GitHub Actions)等关键内容。通过实战案例(如企业级项目自动化测试、持续交付流程搭建),帮助学习者掌握 Java 项目质量保障与自动化交付的完整体系。

19

2025.10.24

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

394

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

394

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

windows安全中心怎么关闭 windows安全中心怎么执行操作
windows安全中心怎么关闭 windows安全中心怎么执行操作

关闭Windows安全中心(Windows Defender)可通过系统设置暂时关闭,或使用组策略/注册表永久关闭。最简单的方法是:进入设置 > 隐私和安全性 > Windows安全中心 > 病毒和威胁防护 > 管理设置,将实时保护等选项关闭。

0

2026.01.26

2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】
2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】

铁路12306提供起售时间查询、起售提醒、购票预填、候补购票及误购限时免费退票五项服务,并强调官方渠道唯一性与信息安全。

1

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号