junit (foo,instanceOf(Bar.class))的Kotlin函数

fafcakar  于 2022-11-11  发布在  Kotlin
关注(0)|答案(5)|浏览(88)

用Kotlin怎么写assertThat(foo, instanceOf(Bar.class))
好像不喜欢.class
如果可能的话,我希望使用比assertTrue(foo is Bar)更“精确”的Assert

rjzwgtxy

rjzwgtxy1#

Bar::class返回KClass的示例,它是Java的Class的Kotlin等价物。
instanceOf方法需要Class示例,而不是KClass,因此您必须使用Bar::class.java转换它。
所以你的Assert应该是:

assertThat(foo, instanceOf(Bar::class.java))

有关Java互操作的更多信息,您可以找到here
此外,您还可以查看Hamkrest库,该库可能会使您的Assert更加流畅:

assert.that(foo, isA<Bar>())
x33g5p2x

x33g5p2x2#

assertThat(foo, instanceOf(Bar::class.java))
文件:https://kotlinlang.org/docs/reference/java-interop.html#getclass

vsikbqxv

vsikbqxv3#

您可以使用Atrium(https://atriumlib.org)并编写以下内容

assertThat(foo).isA<Bar>{}

如果你想Assert更多关于foo的信息,比如说Bar有一个val baz: Int,那么你可以写如下

assertThat(foo).isA<Bar> { 
  property(subject::baz).isSmallerThan(41) 
}
kgqe7b3p

kgqe7b3p4#

如果可能的话,我希望使用一个比assertTrue(foo是Bar)更“精确”的Assert
这是一个正在形成的代码气味。
好的软件设计的“Liskov替换原理”(名字很可笑)建议不要依赖于具体的实现:一个子类型应该总是能够用客户端代码来替换一个类型,而不关心/不受影响。
如果您依赖于子类型的某些特殊功能,请在is之后使用子类型。
如果子类型是动态的(匿名类?)或者类型的名称不在测试代码的命名空间中(私有/内部类?),并且/或者您需要Assert提供了基类示例,则Assert父类型未提供的有关子类型功能的内容(反之亦然)。
如果没有这样的功能具有可公开观察的效果,那么请思考您真正尝试测试的是什么。
我看到的主要例外是
Assert父类型不提供的关于子类型的功能的某些内容(反之亦然)。
将非常慢或者难以运行(例如,混乱状态)。

2ul0zpep

2ul0zpep5#

您可以在此处使用assertInstanceOf doc
而它变得简单如:

import org.junit.jupiter.api.Assertions.assertInstanceOf

assertInstanceOf(Bar::class.java, foo)

相关问题