Предварительно следующее решение выглядит как для работы, перебрасывая любое исключение, пойманное в потоке FX до окончания блока when
:
void executeInFXThreadAndWait( def closure, def ... params ){
Throwable fXThrowable
Platform.runLater({
try {
closure(params)
}catch( Throwable t ){
if( t.message != 'exit' ) {
log.error(t.message, t)
fXThrowable = t
}
}
})
WaitForAsyncUtils.waitForFxEvents()
if( fXThrowable != null ){
// add calling trace so fail trace identifies Specification line concerned
fXThrowable.stackTrace += Thread.currentThread().stackTrace
throw fXThrowable
}
}
Использование (расширение App
Application
):
...
def myClosure = { args ->
App.instance.start( args[ 0 ] )
}
...
when:
TestUtilities.instance.executeInFXThreadAndWait( myClosure, mockStage )
then:
...
Обратите внимание, что при тестировании на «выход» иногда я специально выбрасываю исключение в тесте, чтобы «извлечь» из метода, в котором то, что необходимо проверить, уже было проверено. Если сообщение Throwable
является «выходом», оно игнорируется.
Гипотеза: я предполагаю, не зная, что структура Спока способна определить, было ли «обработано» исключение, и что если он будет переброшен таким образом, то фреймворк не получит «отложенное исключение». Комментарии экспертов Спока приветствуются.
Позже
Несколько дней спустя: похоже, вердикт состоит в том, что это улучшит ситуацию. Тем не менее, все еще может произойти, без какой-либо очевидной предсказуемости или согласованности, что отказ от одной спецификации и функции сообщается в другой спецификации и функции. Каждый раз, когда это происходит, повторный запуск тех же тестов происходит без таких ложных ошибок.
Я полагаю, что Спок не претендует на возможность иметь дело с параллельным программированием. Было бы хорошо узнать, сталкивался ли кто-нибудь еще с этим явлением, когда делал Platform.runLater
в блоке when
.