groovy spock虽然捕获到异常但仍打印stacktrace

时间:2018-11-07 07:21:21

标签: groovy junit spock

我有一个spock测试,它需要一些服务:

   CREATE TABLE writers(
        authorid VARCHAR2(4),
        lname VARCHAR2(10),
        fname VARCHAR2(10),
        isbn VARCHAR2(10),
        title VARCHAR2(30) NOT NULL,
        CONSTRAINT wt_pk FOREIGN KEY(authorid) REFERENCES author(authorid),
        CONSTRAINT wt_fk FOREIGN KEY(isbn) REFERENCES books(isbn),
        UNIQUE KEY unique_authorid(authorid)
    );

我的内部服务

CONSTRAINT wt_pk FOREIGN KEY(authorid) REFERENCES author(authorid),

所以我希望方法返回when: def x = service.call() then: !x 并测试通过。但是,尽管捕获了异常,但从IDE进行的测试调用会打印异常的堆栈跟踪。

测试的目的是不知道是否引发了异常,而只是断言返回的结果为false,所以我不想使用def call() { try { doCall() // method, which throws an exception } catch (e) { false } }

1 个答案:

答案 0 :(得分:0)

首先-检查引发了哪些特定异常并使其超出/pipelines块。您必须注意Groovy中的以下代码:

try-catch

等效于:

try {
   // do something
} catch (e) {
   // do something with exception
}

这意味着try { // do something } catch (Exception e) { // do something with exception } 及其所有子类(除java.lang.Throwable之外)均未包含在try catch中。例如:

java.lang.Exception

def call() { try { throw new Error('Something wrong happened') } catch (e) { false } } 不会捕获此异常,您将在控制台日志中看到以下内容:

try-catch

之所以会这样,是因为java.lang.Error: Something wrong happened at com.github.wololock.micronaut.TestSpec$Service.call(TestSpec.groovy:22) at com.github.wololock.micronaut.TestSpec.test(TestSpec.groovy:13) 扩展了java.lang.Error,并且它不是java.lang.Throwable的子类。

如果您想捕获代码中可能发生的所有可能的异常,则必须在catch块中使用java.lang.Exception,如下所示:

Throwable