用Kotlin怎么写assertThat(foo, instanceOf(Bar.class))?好像不喜欢.class如果可能的话,我希望使用比assertTrue(foo is Bar)更“精确”的Assert
assertThat(foo, instanceOf(Bar.class))
.class
assertTrue(foo is Bar)
rjzwgtxy1#
Bar::class返回KClass的示例,它是Java的Class的Kotlin等价物。instanceOf方法需要Class示例,而不是KClass,因此您必须使用Bar::class.java转换它。所以你的Assert应该是:
Bar::class
KClass
Class
instanceOf
Bar::class.java
assertThat(foo, instanceOf(Bar::class.java))
有关Java互操作的更多信息,您可以找到here。此外,您还可以查看Hamkrest库,该库可能会使您的Assert更加流畅:
assert.that(foo, isA<Bar>())
x33g5p2x2#
assertThat(foo, instanceOf(Bar::class.java))文件:https://kotlinlang.org/docs/reference/java-interop.html#getclass
vsikbqxv3#
您可以使用Atrium(https://atriumlib.org)并编写以下内容
assertThat(foo).isA<Bar>{}
如果你想Assert更多关于foo的信息,比如说Bar有一个val baz: Int,那么你可以写如下
val baz: Int
assertThat(foo).isA<Bar> { property(subject::baz).isSmallerThan(41) }
kgqe7b3p4#
如果可能的话,我希望使用一个比assertTrue(foo是Bar)更“精确”的Assert这是一个正在形成的代码气味。好的软件设计的“Liskov替换原理”(名字很可笑)建议不要依赖于具体的实现:一个子类型应该总是能够用客户端代码来替换一个类型,而不关心/不受影响。如果您依赖于子类型的某些特殊功能,请在is之后使用子类型。如果子类型是动态的(匿名类?)或者类型的名称不在测试代码的命名空间中(私有/内部类?),并且/或者您需要Assert提供了基类示例,则Assert父类型未提供的有关子类型功能的内容(反之亦然)。如果没有这样的功能具有可公开观察的效果,那么请思考您真正尝试测试的是什么。我看到的主要例外是Assert父类型不提供的关于子类型的功能的某些内容(反之亦然)。将非常慢或者难以运行(例如,混乱状态)。
is
2ul0zpep5#
您可以在此处使用assertInstanceOf doc而它变得简单如:
assertInstanceOf
import org.junit.jupiter.api.Assertions.assertInstanceOf assertInstanceOf(Bar::class.java, foo)
5条答案
按热度按时间rjzwgtxy1#
Bar::class
返回KClass
的示例,它是Java的Class
的Kotlin等价物。instanceOf
方法需要Class
示例,而不是KClass
,因此您必须使用Bar::class.java
转换它。所以你的Assert应该是:
有关Java互操作的更多信息,您可以找到here。
此外,您还可以查看Hamkrest库,该库可能会使您的Assert更加流畅:
x33g5p2x2#
assertThat(foo, instanceOf(Bar::class.java))
文件:https://kotlinlang.org/docs/reference/java-interop.html#getclass
vsikbqxv3#
您可以使用Atrium(https://atriumlib.org)并编写以下内容
如果你想Assert更多关于foo的信息,比如说Bar有一个
val baz: Int
,那么你可以写如下kgqe7b3p4#
如果可能的话,我希望使用一个比assertTrue(foo是Bar)更“精确”的Assert
这是一个正在形成的代码气味。
好的软件设计的“Liskov替换原理”(名字很可笑)建议不要依赖于具体的实现:一个子类型应该总是能够用客户端代码来替换一个类型,而不关心/不受影响。
如果您依赖于子类型的某些特殊功能,请在
is
之后使用子类型。如果子类型是动态的(匿名类?)或者类型的名称不在测试代码的命名空间中(私有/内部类?),并且/或者您需要Assert提供了基类示例,则Assert父类型未提供的有关子类型功能的内容(反之亦然)。
如果没有这样的功能具有可公开观察的效果,那么请思考您真正尝试测试的是什么。
我看到的主要例外是
Assert父类型不提供的关于子类型的功能的某些内容(反之亦然)。
将非常慢或者难以运行(例如,混乱状态)。
2ul0zpep5#
您可以在此处使用
assertInstanceOf
doc而它变得简单如: