我有一个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
}
}
答案 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