JUnit:测试注释和预期异常

sku*_*lpt 1 java junit intellij-idea

我正在尝试使用 JUnit 进行测试,但我很难理解我做错了什么。我做了一些非常简单的事情:

一个应该能够创造一些东西的类。到目前为止,我只是在测试它获取的对象是否为空。

public class TestedClass {
    public void create(Object o) {
        if (o == null) {
            throw new IllegalArgumentException();
        } else {
            System.out.println("Not null!");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

tester 类,它创建一个新的 TestedClass 对象并尝试创建一些带有 null 的东西。它需要一个 IllegalArgumentException。

import org.junit.Test;
public class Tester {
    @Test(expected = IllegalArgumentException.class)
    public void createWithNullShouldThrowException() {
        TestedClass t = new TestedClass();
        t.create(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

只是主课。

public class Main {
    public static void main(String[] args) {
        Tester test = new Tester();
        test.createWithNullShouldThrowException();
        System.out.println("passed all tests!");
    }
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,如果在整个测试过程中抛出 IllegalArgumentException,它应该正确终止。这是我的程序终止的情况:

Exception in thread "main" java.lang.IllegalArgumentException
    at TestedClass.create(TestedClass.java:4)
    at Tester.createWithNullShouldThrowException(Tester.java:6)
    at Main.main(Main.java:7)
Run Code Online (Sandbox Code Playgroud)

这不应该发生,因为它应该被 Tester 类中的 createWithNullShouldThrowException() 方法捕获,还是我没有正确理解这一点?我知道我可能可以用 try catch 块来做到这一点,但我只想知道在这种情况下出了什么问题。如果有帮助,我正在使用 IntelliJ IDEA 16.1。任何帮助,将不胜感激。

Mic*_*mlk 5

您不需要主类/方法。单元测试应该通过单元测试运行器运行。在 Intellij Idea 中,您可以右键单击带有 @Test 注释的类,然后单击“运行”菜单项或单击每个测试旁边的小运行图标,或单击测试文件夹的根目录并单击“运行所有测试”。

在 maven 项目中,如果测试在正确的位置,您可以键入mvn test. 其他构建工具将包含运行测试套件的方法。其他 IDE 也是如此。

如果你想要一个main方法,那么你应该通过调用正确的测试运行器来启动 junit 测试框架。但是,您实际上不太可能想要这样做。