Java中测试异常的多种方式

本文详细介绍了在Java中使用JUnit进行异常测试的方法,包括Try-catch方式、JUnit annotation方式、ExpectedException rule以及catch-exception库的应用,旨在提供全面且高效的方式来验证代码中的异常处理逻辑。
摘要由CSDN通过智能技术生成
Java中测试异常的多种方式 使用JUnit来测试Java代码中的异常有很多种方式,你知道几种?

  使用JUnit来测试Java代码中的异常有很多种方式,你知道几种?

  给定这样一个class。

  Person.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Person {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {

        if (age < 0 ) {
            throw new IllegalArgumentException("age is invalid");
        }
        this.age = age;
    }
}

  我们来测试setAge方法。

  Try-catch 方式

1
2
3
4
5
6
7
8
9
10
11
    @Test
    public void shouldGetExceptionWhenAgeLessThan0() {
        Person person = new Person();
        try {
        person.setAge(-1);
            fail("should get IllegalArgumentException");
        } catch (IllegalArgumentException ex) {
            assertThat(ex.getMessage(),containsString("age is invalid"));
        }

    }

这是最容易想到的一种方式,但是太啰嗦。 JUnit annotation方式 JUnit中提供了一个expected的annotation来检查异常。 1 2 3 4 5 6 @Test ( expected = IllegalArgumentException

  这是最容易想到的一种方式,但是太啰嗦。

  JUnit annotation方式

  JUnit中提供了一个expected的annotation来检查异常。

1
2
3
4
5
6
    @Test(expected = IllegalArgumentException.class)
    public void shouldGetExceptionWhenAgeLessThan0() {
        Person person = new Person();
        person.setAge(-1);

    }

  这种方式看起来要简洁多了,但是无法检查异常中的消息。

  ExpectedException rule

  JUnit7以后提供了一个叫做ExpectedException的Rule来实现对异常的测试。

1
2
3
4
5
6
7
8
9
10
11
12
    @Rule
    public ExpectedException exception = ExpectedException.none();

    @Test
    public void shouldGetExceptionWhenAgeLessThan0() {

        Person person = new Person();
        exception.expect(IllegalArgumentException.class);
        exception.expectMessage(containsString("age is invalid"));
        person.setAge(-1);

    }

  这种方式既可以检查异常类型,也可以验证异常中的消息。

  使用catch-exception库

  有个catch-exception库也可以实现对异常的测试。

  首先引用该库。

  pom.xml

1
2
3
4
5
6
        <dependency>
            <groupId>com.googlecode.catch-exception</groupId>
            <artifactId>catch-exception</artifactId>
            <version>1.2.0</version>
            <scope>test</scope> <!-- test scope to use it only in tests -->
        </dependency>

然后这样书写测试。 1 2 3 4 5 6 7 8 @Test public void shouldGetExceptionWhenAgeLessThan0 () { Person person = new Person (); catchException ( person ). setAge (- 1 ); assertThat ( caughtExcept

  然后这样书写测试。

1
2
3
4
5
6
7
8
    @Test
    public void shouldGetExceptionWhenAgeLessThan0() {
        Person person = new Person();
        catchException(person).setAge(-1);
        assertThat(caughtException(),instanceOf(IllegalArgumentException.class));
        assertThat(caughtException().getMessage(), containsString("age is invalid"));

    }

  这样的好处是可以精准的验证异常是被测方法抛出来的,而不是其它方法抛出来的。

  catch-exception库还提供了多种API来进行测试。

  先加载fest-assertion库。

1
2
3
4
5
        <dependency>
            <groupId>org.easytesting</groupId>
            <artifactId>fest-assert-core</artifactId>
            <version>2.0M10</version>
        </dependency>

  然后可以书写BDD风格的测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    @Test
    public void shouldGetExceptionWhenAgeLessThan0() {
        // given
        Person person = new Person();

        // when
        when(person).setAge(-1);

        // then
        then(caughtException())
                .isInstanceOf(IllegalArgumentException.class)
                .hasMessage("age is invalid")
                .hasNoCause();
    }


如果喜欢Hamcrest风格的验证风格的话,catch-exception也提供了相应的Matcher API。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 @Test public void shouldGetExceptionWhenAgeLessThan0 () { // given

  如果喜欢Hamcrest风格的验证风格的话,catch-exception也提供了相应的Matcher API。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    @Test
    public void shouldGetExceptionWhenAgeLessThan0() {
        // given
        Person person = new Person();

        // when
        when(person).setAge(-1);

        // then
        assertThat(caughtException(), allOf(
                instanceOf(IllegalArgumentException.class)
                , hasMessage("age is invalid")
                ,hasNoCause()));
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值