JUnit中对Exception的判断

说来惭愧,虽然之前已经看过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/

时间: 2024-11-04 16:56:21

JUnit中对Exception的判断的相关文章

怎么在html中,用js判断session是否存在

问题描述 我做了一个新闻发布系统,所有的新闻都生成了静态页!现在碰到个问题:如果会员登陆了,在进入新闻页时,显示"欢迎xx",我怎么在html中,用js判断session是否存在!谢谢@! 解决方案 解决方案二:欢迎xx是在标题中的?还是在网页中的?应该是这个写JS中的吧,JS中包含一个.aspx的文件.解决方案三:欢迎xx在网页中解决方案四:functionchecsessoin(){varstrSession="<%=Session["uid"]

如何在wavecom编程中通过AT指令判断被呼方的第一声回铃音

问题描述 如何在wavecom编程中通过AT指令判断被呼方的第一声回铃音 如何在wavecom编程中通过AT指令判断被呼方的第一声回铃音 解决方案 wavecom 的 AT 返回 RING,即可认为是被叫方的回铃声

asp-ASP中一维数组如何判断是否存在重复项呢

问题描述 ASP中一维数组如何判断是否存在重复项呢 请问一下,动态一维数组中如何判断数组中是否存在相同的值呢? 比如说动态数组A() A(1)="A" A(2)="B" A(3)="A" 动态数组B() B(1)=1 B(2)=2 B(3)=3 最后输出的是 A 4 B 2 就是A(1)+A(3) 相同的数组B()相加输出,不相同的直接输出B()对应的值 解决方案 a=split("A,B,A",",")

java ee-请问javaee语言中如何用eclipse判断读取的邮箱的有效性?代码怎么写?

问题描述 请问javaee语言中如何用eclipse判断读取的邮箱的有效性?代码怎么写? 请问javaee语言中如何用eclipse判断读取的邮箱的有效性?代码怎么写? 解决方案 http://blog.sina.com.cn/s/blog_4b5bc011010156bm.html 解决方案二: 直接用正则表达式,,判定是否符合格式要求就行了 解决方案三: 具体怎么做?有没有案列 解决方案四: 不是自己写个正则表达式?

do while-在do-while循环语句中关于定义,判断布尔类型的问题

问题描述 在do-while循环语句中关于定义,判断布尔类型的问题 当定义boolean flag=false或者boolean flag=true时,该程序的运行结果是一样的.while(flag)或者while(!flag)与定义的flag没有关系吗?while(flag)的含义永远是falg=true时继续,而while(!flag)的含义永远是!falg=true时继续吗? public class Test { public static void main(String[]args)

link中如果要先判断对象是否为null?再判断属性是否为null?请问这怎么写?

问题描述 link中如果要先判断对象是否为null?再判断属性是否为null?请问这怎么写? link中如果要先判断对象是否为null?再判断属性是否为null?请问这怎么写? 解决方案 首先你要知道,当一个对象为NULL,那么它的属性肯定为NULL 所以肯定是先判断 对象是否为null,再判断属性是否为null 解决方案二: 自己写个函数,然后linq中调用这个函数对元素值进行解析操作

c语言中不能这样做判断吗

问题描述 c语言中不能这样做判断吗 c语言中的所有比较都是只能2个对象参与吗,这样是错吗 解决方案 C语言是一种很简陋和充满陷阱的语言. 在举一个例子 if (a=b=c) { ... } 这个表达式表面上看是a.b.c相等,其实不然,它会把a b都设为c的值,而且仅仅当c为0(不管a b是什么值),它才是false,否则都是true. C++还有更不可以思议的地方,比如 int a[10]; cout << 1[a]; 这也是合法的. 当然 a[100] = 1;更是合法的,虽然数组越界了,

ios-在iOS中,想要判断text中输入范围

问题描述 在iOS中,想要判断text中输入范围 需要判断text中是否在0到100范围内,是的话进行跳转,否则弹出提示框,该如何做? 解决方案 http://blog.csdn.net/hintcnuie/article/details/17331971 限制数字范围在此基础上稍微修改,转换为数字,然后判断大小即可. 解决方案二: 参考http://blog.csdn.net/hintcnuie/article/details/17331971

jsp中EL表达式在判断时如何取值呢

问题描述 jsp中EL表达式在判断时如何取值呢 ${users.getUsers_name()!=""?"欢迎你"+${usershttp://ask.csdn.net/questions/238187#.getUsers_name()}:"您还没有登陆,请登录"} 如果登陆成功,我想把用户名也得到,但是不行呢 解决方案 ${ !empty(users.getUsers_name())?"欢迎你${users.getUsers_name