带有expected = exception的Java测试失败,出现断言错误

Dav*_*veM 1 java junit exception

我遇到了测试用例的问题.

正在测试的方法有一个try/catch,它可以捕获MalformedURLException但是在测试期间,由于需要MalformedURLException的Junit AssertionError而导致失败.但我无法找出实际投掷的内容!这是我的代码(在eclipse中创建为MWE).

我想测试的方法

public void throwMalFormedURLException(){

    String s = new String("www.google.com");

    try{
        url = new URL(s);
    }catch (Exception e){
        e.printStackTrace();
        e.getClass();
        e.getCause();
    }


}
Run Code Online (Sandbox Code Playgroud)

测试方法

@Test (expected = MalformedURLException.class)
public void testThrowMalFormedURLException() {
    MWE testClass = new MWE();
    testClass.throwMalFormedURLException();
    System.out.println("End of test");
}
Run Code Online (Sandbox Code Playgroud)

这是控制台中的输出

测试结束错误的详细信息如下:java.net.MalformedURLException:无协议:www.google.com
at java.net.URL.(URL.java:593)
at java.net.URL.(URL.java:490)
at java.net.URL.(URL.java:439)
在MWE.throwMalFormedURLException(MWE.java:12)
的testMWE.testThrowMalFormedURLException(testMWE.java:12)

在Junit控制台中,它说:

java.lang.AssertionError:预期的异常:Java.net.MalformedURLException

但Junit报告失败,即使控制台告诉我我有一个MalformedURLException.

我在这次测试中做错了什么?

谢谢你的想法.

大卫

Jim*_*mes 7

您正在捕获异常,因此它不会被抛出.

如果您的目的是测试您是否正在捕获异常并将其正确地转发回"用户",那么您应该专门为此创建测试.您可能不希望单元测试中的UI元素*因此这是一个抽象和DI有很多价值的地方.一种简单的方法是创建一个模拟对象,该对象将侦听错误消息并在收到消息时标记标记.单元测试会触发错误,然后在标志设置后通过.您还应该进行否定测试或断言在抛出异常之前未设置该标志.

*测试UI也是一个好主意,但它可能有点慢.有各种自动化工具.它通常属于不同的测试阶段.您真的希望单元测试非常快,以便您可以非常频繁地运行它们.