junit4X系列--Exception

本文介绍了在JUnit中测试异常抛出的多种方法,包括使用@Test注解的expected属性和ExpectedException Rule注解,以及如何验证异常消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文出处:http://www.blogjava.net/DLevin/archive/2012/11/02/390684.html。感谢作者的无私分享。

说来惭愧,虽然之前已经看过JUnit的源码了,也写了几篇博客,但是长时间不写Test Case,今天想要写抛Exception相关的test case时,竟然不知道怎么写了。。。。。好记性不如烂笔头,记下来先~~

对于使用验证Test Case方法中抛出的异常,我起初想到的是一种比较简单的方法,但是显得比较繁琐:

    @Test
    
public   void  testOldStyle()  {
        
try {
            
double value = Math.random();
            
if(value < 0.5{
                
throw new IllegalStateException("test");
            }

            Assert.fail(
"Expect IllegalStateException");
        }
 catch(IllegalStateException e) {
        }

    }

Google了一下,找到另外几种更加方便的方法:1,使用Test注解中的expected字段判断抛出异常的类型。2,使用ExpectedException的Rule注解。
个人偏好用Test注解中的expected字段,它先的更加简洁,不管读起来还是写起来都很方便,并且一目了然:
    @Test(expected  =  IllegalStateException. class )
    
public   void  testThrowException()  {
        
throw new IllegalStateException("test");
    }

    
    @Test(expected 
=  IllegalStateException. class )
    
public   void  testNotThrowException()  {
        System.out.println(
"No Exception throws");
    }

对Rule注解的使用(只有在JUnit4.7以后才有这个功能),它提供了更加强大的功能,它可以同时检查异常类型以及异常消息内容,这些内容可以只包含其中的某些字符,ExpectedException还支持使用hamcrest中的Matcher,默认使用IsInstanceOf和StringContains Matcher。在BlockJUnit4ClassRunner的实现中,每一个Test Case运行时都会重新创建Test Class的实例,因而在使用ExpectedException这个Rule时,不用担心在多个Test Case之间相互影响的问题:
    @Rule
    
public   final  ExpectedException expectedException  =  ExpectedException.none();
    
    @Test
    
public   void  testThrowExceptionWithRule()  {
        expectedException.expect(IllegalStateException.
class);
        
        
throw new IllegalStateException("test");
    }

    
    @Test
    
public   void  testThrowExceptionAndMessageWithRule()  {
        expectedException.expect(IllegalStateException.
class);
        expectedException.expectMessage(
"fail");
        
        
throw new IllegalStateException("expect fail");
    }

在stackoverflow中还有人提到了使用google-code中的catch-exception工程,今天没时间看了,回去好好研究一下。地址是: http://code.google.com/p/catch-exception/

### JUnit Jupiter Params 的最新版本 JUnit Jupiter 是 JUnit 5 中的核心组件,提供了新的编程模型和扩展模型。`junit-jupiter-params` 是 JUnit Jupiter 的一部分,主要用于参数化测试的支持。为了获取 `junit-jupiter-params` 的最新版本,可以通过 Maven Central Repository 或其他官方资源查询。 以下是当前最新的稳定版本(截至最近更新时间): #### 最新版本号 目前,`junit-jupiter-params` 的最新版本为 **5.10.0**[^6]。此版本属于 JUnit 5 系列的一部分,并包含了多项改进和错误修复。 --- ### 如何在项目中引入 `junit-jupiter-params` 如果使用 Gradle 构建工具,可以在项目的 `build.gradle` 文件中添加如下依赖项: ```gradle dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-params:5.10.0' } ``` 如果是 Maven 项目,则需要在 `pom.xml` 文件中添加以下内容: ```xml <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-params</artifactId> <version>5.10.0</version> <scope>test</scope> </dependency> ``` 上述配置确保了项目能够正确加载并使用 `junit-jupiter-params` 提供的功能。 --- ### 参数化测试示例 下面是一个简单的参数化测试代码示例,展示了如何利用 `@ParameterizedTest` 注解以及 `@CsvSource` 来定义多个输入数据集: ```java import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; class ParameterizedTestExample { @ParameterizedTest @CsvSource({ "1, 2, 3", "4, 5, 9", "-1, -2, -3" }) void testAddition(int a, int b, int expected) { assertEquals(expected, a + b); } } ``` 通过这种方式可以轻松实现多组数据的自动化验证。 --- ### 常见问题排查 对于某些开发者可能遇到的问题,例如无法解析 `org.junit.jupiter` 类的情况,通常是因为构建文件中的依赖未正确定义或环境配置存在问题。建议按照以下方法解决: 1. 确保已启用 JUnit Platform 支持,在 Gradle 配置中加入: ```gradle test { useJUnitPlatform() } ``` 2. 如果使用的是 IDE(如 IntelliJ IDEA),需确认其缓存已被清理并重新同步项目依赖。 3. 对于手动导入 `.jar` 文件的方式,不推荐这样做,尤其是在现代开发环境中应优先采用依赖管理工具来处理库文件。 以上操作有助于避免因依赖缺失而导致的编译失败等问题[^7]。 --- ### 总结 综上所述,`junit-jupiter-params` 的最新版本为 **5.10.0**,适用于需要执行复杂场景下的参数化单元测试需求。同时需要注意合理设置构建脚本以保障功能正常运作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值