-1

假设我有一个要进行单元测试的简单方法:

public class Add {
    public static int addTheFollowingPositiveNumberToOne(int a) {
        if(a <= 0) {
            throw new IllegalArgumentException();
        }
        int b = 1 + a;
        return b;
    }
}

如果参数小于或等于 0,我想确保抛出 IllegalArgumentException。

JUnit 代码看起来像这样:

@Test (expected = IllegalArgumentException.class)
public void testIllegalArgumentException() {
    int a = -1;
    Add.addTheFollowingPositiveNumberToOne(a);
}

为什么我必须在最后添加 .class ?

4

3 回答 3

5

如果您看到expected() 参数的 API 文档,它采用的参数类型为Class。这就是为什么您将IllegalArgumentException类类型传递为IllegalArgumentException.class.

于 2013-10-07T05:27:04.013 回答
3

实际上,IllegalArgumentException是一个抛出的类,以指示方法已传递了非法或不适当的参数。这实际上是 java 中的一个扩展类RuntimeException。这是继承层次结构。

java.lang.Object
--java.lang.Throwable
   --java.lang.Exception
      --java.lang.RuntimeException
        --java.lang.IllegalArgumentException

至于为什么需要指定@Test (expected = IllegalArgumentException.class),这里简单解释一下:

@Test注释支持两个可选参数。第一个,预期的,声明一个测试方法应该抛出一个异常如果它没有抛出异常,或者它抛出的异常与声明的异常不同,则测试失败。例如,以下测试成功

@Test(expected=IndexOutOfBoundsException.class) public void outOfBounds() {
       new ArrayList<Object>().get(1);
    }

第二个可选参数 timeout 如果测试花费的时间超过指定的时钟时间(以毫秒为单位),则会导致测试失败。以下测试失败:

@Test(timeout=100) public void infinity() {
   while(true);
}

参考检查:

希望能帮助到你。:)

于 2013-10-07T05:34:32.303 回答
2

当你写.class在类名之后时,它引用代表给定类的Class对象。

此外,另一个需要注意的重要事项是

ClassName.class当该类的实例不可用时使用。并且你classObject.getClass()在类的实例可用时使用。

如果您查看注释的文档expected()@Test

预期的公共抽象 java.lang.Class

(可选)指定预期的 Throwable 以使测试方法成功,前提是方法抛出了指定类的异常。

expected接受类型的参数class(扩展Throwable),因此你.classIllegalArgumentException.

IllegalArgumentException- 扩展 throwable .class- 给出预期的类对象。

于 2013-10-07T05:29:42.440 回答