0

我使用密封类向客户端代码报告成功或错误:

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))

我收到消息:类型推断失败。没有足够的信息来推断 fun instanceOf(type : Class<*>) 中的参数 T:Matcher!

看起来我错过了 Kotlin 中的一些重要内容。

谢谢你的协助!

4

3 回答 3

5

你的代码对我来说没有问题。

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 中)

于 2019-04-30T09:23:58.160 回答
0

看起来我在寻找虚假的 API。因为我主要使用assertj。下面的代码干净流畅,易于阅读

assertThat(result).isInstanceOf(Result.Error::class.java)
于 2019-05-03T10:02:23.067 回答
0

为了避免 ::class 我更喜欢这个。

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

于 2020-02-15T17:07:40.587 回答