Как я могу провалить тест JUnit из правила теста - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть некоторый асинхронный код, который может выдать исключение, которое 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) }
    }
}
...