如何在Java Junit中测试异常

时间:2016-08-02 11:07:07

标签: java class junit illegalargumentexception roman-numerals

我创建了以下用于验证罗马数字转换器的方法。 在JUnit中,测试通过,但程序不会抛出任何异常。 我哪里错了?

public void validateState(String number){
    if(!number.matches("^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$"))
        throw new IllegalArgumentException("Invalid number");

    System.out.println("Invalid number");
}

测试:

@Test(expected = IllegalArgumentException.class)
public void test15() throws Exception {
    new RomanNumber("").validateState("MMMMM");
}

感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

如果测试通过,则意味着您的方法中会抛出IllegalArgumentException 否则,JUnit测试将失败,因为在这里你做了一个断言@Test(expected = IllegalArgumentException.class) 异常被抛出:

@Test(expected = IllegalArgumentException.class)

删除@Test,您会看到测试失败。

编辑以回答您的评论: 为什么我看不到“无效号码”消息

如果任何调用者对象没有捕获到异常,您会在输出(终端)中看到带有堆栈跟踪的异常。但正如我在我的评论中刚才解释的那样,在你的情况下,你没有看到异常,因为它被JUnit(它是一个调用者对象)所捕获,因为你在IllegalArgumentException注释中使用了期望的属性。当您运行方法时,JUnit运行器会拦截抛出的IllegalArgumentException,因为JUnit运行程序知道它必须检查是否抛出了scanForPeripheralsWithServices
只有当异常返回到调用堆栈的顶部(这意味着执行的代码中没有人捕获到异常)时,JVM才会在输出中写入异常(在本例中为错误流)

答案 1 :(得分:0)

测试必须通过,你的逻辑是正确的。你的测试说它期望抛出一个异常而且确实如此。 Junit捕获异常,验证它并使测试通过它。

expected = IllegalArgumentException.class 

@Test注释中删除此行,它将开始抛出异常。

答案 2 :(得分:0)

你似乎在问为什么

public void validateState(String number) {
    if (!number.matches(...))
        throw new IllegalArgumentException("Invalid number");

    System.out.println("Invalid number");
}

不会抛出异常并同时打印错误消息。

原因是当抛出异常时,它将传播跳过语句,直到在封闭的try ... catch中捕获到异常。在这种情况下,将跳过println调用。这是正常的Java行为......

如果要抛出异常并打印要打印的消息,请按以下方式编写:

public void validateState(String number) {
    if (!number.matches(...)) {
        System.out.println("Invalid number");
        throw new IllegalArgumentException("Invalid number");
    }
}