NoWhenBranchMatchedException с исчерпывающим блоком «когда» в Котлине - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть следующий запечатанный класс в Котлине

sealed class Result<T, E> {
    class Success<T, E>(val result: T) : Result<T, E>()
    class Failure<T, E>(val failure: E) : Result<T, E>()
}

и я возвращаю сущность Результата из create() функции

и использование следующего с RxJava2,

    return Single.fromCallable { repository.create(details) }
            .map {
                return@map when(result) {
                        is Result.Success -> CreatedState.Success(result.result)
                        is Result.Failure -> CreatedState.Error(result.failure)
                }
            }

Насколько я могу судить, функциональность работает так, как задумано. Однако, когда я тестирую это,

    val testSubscriber = underTest.create(newDetails).test()

Я получаю java.lang.IllegalStateException и вижу kotlin.NoWhenBranchMatchedException в списке исключений (при выполнении assertComplete()), который я не могу понять, как это произойдет, так как мой, когда проверка является исчерпывающей. Или я что-то там упускаю?

ТИА!

1 Ответ

0 голосов
/ 09 сентября 2018

Вы используете два выражения. Внешнее выражение «когда» не является исчерпывающим.

return Single.fromCallable { repository.create(details) }
        .map {
            return@map when { // This is non-exhaustive, you don't need this
                when (result) {
                    is Result.Success -> CreatedState.Success(result.result)
                    is Result.Failure -> CreatedState.Error(result.failure)
                }
            }
        }

Внешний ничего не достигает. Вы должны удалить внешнее, когда.

return Single.fromCallable { repository.create(details) }
            .map {
                  when (result) {
                        is Result.Success -> CreatedState.Success(result.result)
                        is Result.Failure -> CreatedState.Error(result.failure)
                  }

            }
...