Котлин опечатал класс и тип вывод

Я использую запечатанный класс, чтобы сообщить об успехе или ошибке клиентскому коду:

sealed class Result<out T : Any> {
    data class Success<out T : Any>(val data: T) : Result<T>()
    data class Error(val exception: Exception) : Result<Nothing>()
}

Но я застрял, получив даже самый простой модульный тест для компиляции, используя его:

    val error = Result.Error(IOException("message"))
    assertThat(error, instanceOf(Result.Error::class.java))

Я получаю сообщение: Ошибка вывода типа. Недостаточно информации для вывода параметра T в забавном instanceOf(тип: Class<*>): Matcher!

Похоже, я упускаю что-то важное в Котлине.

Спасибо за помощь мне!

2 ответа

Для меня нет проблем с вашим кодом.

import org.hamcrest.CoreMatchers.instanceOf
import org.junit.Test

import org.junit.Assert.*
import java.io.IOException

class ExampleUnitTest {
    @Test
    fun test1() {
        val error = Result.Error(IOException("message"))
        assertTrue(error is Result.Error)
    }

    @Test
    fun test2() {
        val error = Result.Error(IOException("message"))
        assertThat(error , instanceOf(Result.Error::class.java))
    }

    sealed class Result<out T : Any> {
        data class Success<out T : Any>(val data: T) : Result<T>()
        data class Error(val exception: Exception) : Result<Nothing>()
    }
}

Также я предлагаю вам использовать ключевое слово is проверить, является ли ваш класс экземпляром чего-либо в kotlin (как в test1)

Чтобы избежать::class, я предпочитаю это.

assertThat(result is Result.Error).isTrue()

Похоже, я искал в ложном API. Поскольку я в основном использую assertj. Ниже код чистый и свободный для чтения

assertThat(result).isInstanceOf(Result.Error::class.java)
Другие вопросы по тегам