所以我知道如何在我的处理程序单元测试中正确检查何时抛出异常。
但是,当我想确保没有抛出异常时,正确的方法是什么?
这是我迄今为止最好的:
def "No exception is thrown"() {
given:
def noExceptionThrown = false
when:
def result = RequestFixture.handle(new TestEndpoint(), { fixture -> fixture.uri("path/a)})
then:
try {
result.exception(CustomException)
} catch(ratpack.test.handling.HandlerExceptionNotThrownException e) {
noExceptionThrown = (e != null)
}
noExceptionThrown
}
答案 0 :(得分:2)
您可以稍微重新排序代码,因此您可以使用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)
}
另一种选择是在测试中使用自定义错误处理程序并将其添加到fixture的注册表中。自定义错误处理程序可以具有指示抛出异常的方法。 请参阅以下示例:
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()
}
}