Котлин опечатал класс и тип вывод
Я использую запечатанный класс, чтобы сообщить об успехе или ошибке клиентскому коду:
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)