У меня есть некоторый асинхронный код, который может выдать исключение, которое JUnit пропускает (поэтому тест проходит).
Я создал TestRule
, чтобы собрать эти исключения в список. После завершения любого теста утверждение запускается по списку и не проходит тест, если список исключений не пустой.
Вместо того, чтобы не выполнить после теста, я хотел бы сразу же пройти тест при возникновении исключения. Возможно ли это сделать с помощью TestRule
?
Мой TestRule
/**
* Coroutines can throw exceptions that can go unnoticed by the JUnit Test Runner which will pass
* a test that should have failed. This rule will ensure the test fails, provided that you use the
* [CoroutineContext] provided by [dispatcher].
*/
class CoroutineExceptionRule : TestWatcher(), TestRule {
private val exceptions = Collections.synchronizedList(mutableListOf<Throwable>())
val dispatcher: CoroutineContext
get() = Unconfined + CoroutineExceptionHandler { _, throwable ->
// I want to hook into test lifecycle and fail test immediately here
exceptions.add(throwable)
// this throw will not always fail the test. this does print the stacktrace at least
throw throwable
}
override fun starting(description: Description) {
exceptions.clear()
}
override fun finished(description: Description) {
// instead of waiting for test to finish to fail it
exceptions.forEach { throw AssertionError(it) }
}
}