您可以稍微重新排序代码,这样您就可以使用 Spock 的thrown
方法:
def "No exception is thrown"() {
given:
def result = RequestFixture.handle(new TestEndpoint(), { fixture -> fixture.uri("path/a)})
when:
result.exception(CustomException)
then:
thrown(HandlerExceptionNotThrownException)
}
另一种选择是在测试中使用自定义错误处理程序并将其添加到夹具的注册表中。自定义错误处理程序可以具有指示是否引发异常的方法。请参见以下示例:
package sample
import ratpack.error.ServerErrorHandler
import ratpack.handling.Context
import ratpack.handling.Handler
import ratpack.test.handling.RequestFixture
import spock.lang.Specification
class HandlerSpec extends Specification {
def 'check exception is thrown'() {
given:
def errorHandler = new TestErrorHandler()
when:
RequestFixture.handle(new SampleHandler(true), { fixture ->
fixture.registry.add ServerErrorHandler, errorHandler
})
then:
errorHandler.exceptionThrown()
and:
errorHandler.throwable.message == 'Sample exception'
}
def 'check no exception is thrown'() {
given:
def errorHandler = new TestErrorHandler()
when:
RequestFixture.handle(new SampleHandler(false), { fixture ->
fixture.registry.add ServerErrorHandler, errorHandler
})
then:
errorHandler.noExceptionThrown()
}
}
class SampleHandler implements Handler {
private final boolean throwException = false
SampleHandler(final boolean throwException) {
this.throwException = throwException
}
@Override
void handle(final Context ctx) throws Exception {
if (throwException) {
ctx.error(new Exception('Sample exception'))
} else {
ctx.response.send('OK')
}
}
}
class TestErrorHandler implements ServerErrorHandler {
private Throwable throwable
@Override
void error(final Context context, final Throwable throwable) throws Exception {
this.throwable = throwable
context.response.status(500)
context.response.send('NOK')
}
boolean exceptionThrown() {
throwable != null
}
boolean noExceptionThrown() {
!exceptionThrown()
}
}