`

使用JUnit测试预期异常(转)

 
阅读更多

原文链接: javacodegeeks 翻译: ImportNew.com 踏雁寻花
译文链接: http://www.importnew.com/10079.html

 

开发人员常常使用单元测试来验证的一段儿代码的操作,很多时候单元测试可以检查抛出预期异常(expected exceptions)的代码。在Java语言中,JUnit是一套标准的单元测试方案,它提供了很多验证抛出的异常的机制。本文就探讨一下他们的优点。

 

我们拿下面的代码作为例子,写一个测试,确保canVote() 方法返回true或者false, 同时你也能写一个测试用来验证这个方法抛出的IllegalArgumentException异常。

public class Student {
  public boolean canVote(int age) {
      if (i<=0) throw new IllegalArgumentException("age should be +ve");
      if (i<18) return false;
      else return true;
  }
}

(Guava类库中提供了一个作参数检查的工具类–Preconditions类,也许这种方法能够更好的检查这样的参数,不过这个例子也能够检查)。

 

检查抛出的异常有三种方式,它们各自都有优缺点:

 

1.@Test(expected…)

@Test注解有一个可选的参数,”expected”允许你设置一个Throwable的子类。如果你想要验证上面的canVote()方法抛出预期的异常,我们可以这样写:

@Test(expected = IllegalArgumentException.class)
public void canVote_throws_IllegalArgumentException_for_zero_age() {
    Student student = new Student();
    student.canVote(0);
}

 简单明了,这个测试有一点误差,因为异常会在方法的某个位置被抛出,但不一定在特定的某行。

 

2.ExpectedException

如果要使用JUnit框架中的ExpectedException类,需要声明ExpectedException异常。

@Rule
public ExpectedException thrown= ExpectedException.none();

 然后你可以使用更加简单的方式验证预期的异常。

@Test
public void canVote_throws_IllegalArgumentException_for_zero_age() {
    Student student = new Student();
    thrown.expect(IllegalArgumentException.class);
    student.canVote(0);
}

 或者可以设置预期异常的属性信息。

@Test
public void canVote_throws_IllegalArgumentException_for_zero_age() {
    Student student = new Student();
    thrown.expect(IllegalArgumentException.class);
    thrown.expectMessage("age should be +ve");
    student.canVote(0);
}

 除了可以设置异常的属性信息之外,这种方法还有一个优点,它可以更加精确的找到异常抛出的位置。在上面的例子中,在构造函数中抛出的未预期的(unexpected) IllegalArgumentException 异常将会引起测试失败,我们希望它在canVote()方法中抛出。

 

从另一个方面来说,如果不需要声明就更好了

@Rule
public ExpectedException thrown= ExpectedException.none();

它就像不需要的噪音一样,如果这样就很好了

expect(RuntimeException.class)

或者:

expect(RuntimeException.class, “Expected exception message”)

或者至少可以将异常和信息当做参数传进去 

thrown.expect(IllegalArgumentException.class, “age should be +ve”);

 

3.Try/catch with assert/fail

在JUnit4之前的版本中,使用try/catch语句块检查异常

@Test
public void canVote_throws_IllegalArgumentException_for_zero_age() {
    Student student = new Student();
    try {
        student.canVote(0);
    } catch (IllegalArgumentException ex) {
        assertThat(ex.getMessage(), containsString("age should be +ve"));
    }
    fail("expected IllegalArgumentException for non +ve age");
}

尽管这种方式很老了,不过还是非常有效的。主要的缺点就是很容易忘记在catch语句块之后需要写fail()方法,如果预期异常没有抛出就会导致信息的误报。我曾经就犯过这样的错误。

 

总之,这三种方法都可以测试预期抛出的异常,各有优缺点。对于我个人而言,我会选择第二种方法,因为它可以非常精确、高效的测试异常信息。

 

 

分享到:
评论

相关推荐

    在Eclipse中使用JUnit4进行单元测试

    创建JUnit测试类是单元测试的第一步。在Eclipse中,右键点击项目,选择"New" &gt; "JUnit Test Case"。在此过程中,需要选择要测试的源代码类以及要测试的方法。测试类通常会继承自`org.junit.Test`注解的基类,并且每...

    单元测试之道Java版——使用Junit

    6. **运行测试**:使用IDE(如Eclipse、IntelliJ IDEA)内置的Junit支持,或者通过命令行运行Junit测试套件。 7. **查看测试结果**:测试失败时,Junit会显示失败的测试用例及具体的失败信息,帮助我们定位问题。 ...

    JUnit3.8.1 以及使用JUnit测试的代码demo

    在`JUnit & 简单Junit使用代码`这个文件中,可能包含了一个或多个示例,展示了如何创建测试类、编写测试方法、使用断言以及设置测试环境。例如,可能有一个简单的数学操作类`MathUtils`,以及对应的测试类`...

    junit测试_java_JUnit_JUnit测试_

    例如,文件可能会讲解如何设置一个基本的JUnit测试类,通常这个类会继承自`junit.framework.TestCase`(对于较旧的JUnit版本)或者使用注解`@RunWith(JUnit4.class)`(对于JUnit 4及以上版本)。 测试类中的每个...

    自动饮料机Junit测试(软件测试与质量保证实验).rar

    本实验“自动饮料机Junit测试”旨在帮助学生深入理解和应用单元测试,特别是在Java编程环境下。单元测试是一种针对程序代码最小可测试单元进行验证的方法,通常这个单元是函数或方法。Junit是Java领域广泛使用的单元...

    JUnit测试代码示例

    5. **异常测试**:JUnit3允许你测试一个方法是否抛出了预期的异常,例如`try { ... } catch (Exception e) { fail("异常未正确抛出"); }` 6. **测试运行器**:JUnit3默认的运行器会顺序执行所有的测试,如果有测试...

    Junit测试jar包

    4. **异常测试**:如果预期代码应抛出异常,可以使用`@Test(expected = Exception.class)`来捕获并验证异常类型。 5. **测试注解**:JUnit5引入了更多的注解,如`@Before`和`@After`用于定义在每个测试方法执行前后...

    使用junit测试ssh中的dao

    标题“使用junit测试ssh中的dao”涉及到的是Java开发中的单元测试技术,特别是针对SSH(Struts2、Spring、Hibernate)框架中的数据访问对象(DAO)进行测试。SSH是Java Web开发中常用的三大开源框架,它们协同工作以...

    Ant 使用Junit进行单元测试

    然后,我们有两个目标,一个是`compile`,用于编译源代码,另一个是`test`,用于执行JUnit测试。`junit`任务中,我们指定了测试报告的输出格式和失败时是否停止测试,以及要运行的测试类。 对于单元测试,我们需要...

    junit测试小例子

    `@Expected`注解可以指定测试方法预期抛出的异常类型,如果方法没有抛出预期的异常或者抛出了不同类型的异常,测试就会失败。 JUnit还支持断言(Assertions),这是测试的核心部分。通过使用如`assertEquals`、`...

    Junit测试学习文档

    《Junit测试学习文档》 在软件开发过程中,单元测试是一项至关重要的工作,它能确保代码的正确性,提高代码质量,并为后续的维护和重构提供保障。Junit作为Java编程语言中最流行的单元测试框架,是每个Java开发者...

    javaweb中.java文件测试需要的框架(junit测试).rar

    本压缩包文件"javaweb中.java文件测试需要的框架(junit测试).rar"显然是为了帮助开发者理解如何在Java Web项目中使用JUnit进行测试。 **JUnit框架详解** JUnit是一个基于注解的测试框架,它的核心功能包括: 1....

    junit测试案例程序

    除了基础的JUnit用法,更高级的特性包括异常测试(使用`assertThrows()`检查预期的异常)、定时测试(`@Test(timeout = XXX)`限制测试方法的执行时间)以及测试套件(`@Suite`注解组合多个测试类)。学习这些高级...

    junit4测试jar包

    3. **异常测试**:`@Test(expected = Exception.class)`可以用来测试方法是否抛出了预期的异常。 4. **测试套件(Test Suites)**:`@Suite`注解允许将多个测试类组合成一个测试套件,便于一起运行。 5. **参数化...

    junit测试测试代码

    使用`@Test`注解时,可以配合`expected`参数来检查方法是否抛出了预期的异常,例如:`@Test(expected = NullPointerException.class)`。 5. **测试套件(Test Suites)**: 多个测试类或测试方法可以通过`@Suite`...

    junit测试小demo

    在这个名为"junit测试小demo"的压缩包文件中,我们可以预期它包含了一些关于如何使用Junit进行单元测试的示例代码或教程。 首先,让我们来理解一下Junit的基本概念。Junit是一个开源项目,由Eclipse基金会维护,...

    Myeclipse中的JUnit测试详细

    下面将详细阐述MyEclipse中进行JUnit测试的相关知识点。 首先,理解JUnit测试的基本概念。JUnit是一个开源的Java测试框架,它允许程序员编写测试用例来检查代码的各个单元是否按预期工作。测试用例通常包括一系列...

    使用JUnit进行单元测试PPT

    - `@Expected`:预期测试抛出的异常。 - `@Timeout`:设置测试超时。 **测试原则与注意事项**: 1. **明确输入和输出**:为不同的输入和边界条件编写测试用例。 2. **可重复性**:测试结果应始终一致,避免出现非...

    Java单元测试JUnit4.7

    在实际使用中,开发人员通常会结合构建工具如Maven或Gradle,以及IDE如Eclipse、IntelliJ IDEA来运行JUnit测试。这些工具能够自动化测试执行,生成测试报告,帮助分析和调试。 总的来说,JUnit 4.7作为Java单元测试...

Global site tag (gtag.js) - Google Analytics