assertk 测试不应通过(嵌套所有/任何?)
assertk test shouldn't pass (nested alls / any ?)
我有一个应该通过但没有通过的测试,在提出一个小测试用例来演示该行为的过程中,我做了一个不应该通过但确实通过的测试。这是测试:
@Test
fun `should not pass`() {
val key1 = "key1"
val value1 = "value1"
val key2 = "key2"
val value2 = "value2"
val map: Map<String, Collection<Any>> = mapOf(key1 to listOf(value1), key2 to setOf(value2))
assertThat(map.entries).all {
any {
it.all {
prop(Map.Entry<String, Any>::key).isEqualTo(key1) // assert 1
prop(Map.Entry<Any, Collection<Any>>::key).isEqualTo(value1) // assert 2
fail("Expected value", "Actual value") // assert 3
}
}
}
}
我打错了 assert 2
并提取了键而不是值。当我意识到这一点时,我不明白为什么测试仍然通过了。所以我加了assert 3
强制失败,但是测试还是通过了!奇怪的是,如果我从映射中删除第二个条目(key2
和 value2
),那么测试确实会按预期失败。
我怀疑这可能与嵌套的 all
和 any
有关,但我有理由这样设置它。为了使示例变小,我还有其他断言已被省略。
有人知道为什么这个测试在不应该通过的时候通过了吗?
- assertk 版本 0.23
- junit 版本 5.7.0
- 科特林版本 1.3.72
- java 版本 11.0.9.1
Gradle 依赖关系:
implementation(platform("org.jetbrains.kotlin:kotlin-bom"))
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
testImplementation("org.jetbrains.kotlin:kotlin-test")
testImplementation("org.jetbrains.kotlin:kotlin-test-junit5")
testImplementation("com.willowtreeapps.assertk:assertk-jvm:0.23")
testImplementation("io.mockk:mockk:1.10.3-jdk8")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.0")
使用导入测试 class:
import assertk.all
import assertk.assertThat
import assertk.assertions.any
import assertk.assertions.isEqualTo
import assertk.assertions.prop
import kotlin.test.Test
class AssertkNestedAllSimpleTest {
@Test
fun `should not pass`() {
val key1 = "key1"
val value1 = "value1"
val key2 = "key2"
val value2 = "value2"
val map: Map<String, Collection<Any>> = mapOf(key1 to listOf(value1), key2 to setOf(value2))
assertThat(map.entries).all {
any {
it.all {
prop(Map.Entry<String, Any>::key).isEqualTo(key1) // assert 1
prop(Map.Entry<Any, Collection<Any>>::key).isEqualTo(value1) // assert 2
}
}
}
}
}
GitHub 带有完整代码的项目例如:https://github.com/bschelberg/assertk-test-issue
此测试失败。检查你的 assertThat 和 @Test 导入并检查它是否仍然通过
使用这些导入:
import assertk.all
import assertk.assertThat
import assertk.assertions.*
import assertk.fail
import org.junit.Test
并且这个 Maven 依赖项测试失败了。
<dependency>
<groupId>com.willowtreeapps.assertk</groupId>
<artifactId>assertk-jvm</artifactId>
<version>0.23</version>
<scope>test</scope>
</dependency>
这是 assertk 中的错误:https://github.com/willowtreeapps/assertk/issues/331。 any
块中出现不止一次故障时会出现此问题。
已在 v0.23.1 中修复
我有一个应该通过但没有通过的测试,在提出一个小测试用例来演示该行为的过程中,我做了一个不应该通过但确实通过的测试。这是测试:
@Test
fun `should not pass`() {
val key1 = "key1"
val value1 = "value1"
val key2 = "key2"
val value2 = "value2"
val map: Map<String, Collection<Any>> = mapOf(key1 to listOf(value1), key2 to setOf(value2))
assertThat(map.entries).all {
any {
it.all {
prop(Map.Entry<String, Any>::key).isEqualTo(key1) // assert 1
prop(Map.Entry<Any, Collection<Any>>::key).isEqualTo(value1) // assert 2
fail("Expected value", "Actual value") // assert 3
}
}
}
}
我打错了 assert 2
并提取了键而不是值。当我意识到这一点时,我不明白为什么测试仍然通过了。所以我加了assert 3
强制失败,但是测试还是通过了!奇怪的是,如果我从映射中删除第二个条目(key2
和 value2
),那么测试确实会按预期失败。
我怀疑这可能与嵌套的 all
和 any
有关,但我有理由这样设置它。为了使示例变小,我还有其他断言已被省略。
有人知道为什么这个测试在不应该通过的时候通过了吗?
- assertk 版本 0.23
- junit 版本 5.7.0
- 科特林版本 1.3.72
- java 版本 11.0.9.1
Gradle 依赖关系:
implementation(platform("org.jetbrains.kotlin:kotlin-bom"))
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
testImplementation("org.jetbrains.kotlin:kotlin-test")
testImplementation("org.jetbrains.kotlin:kotlin-test-junit5")
testImplementation("com.willowtreeapps.assertk:assertk-jvm:0.23")
testImplementation("io.mockk:mockk:1.10.3-jdk8")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.0")
使用导入测试 class:
import assertk.all
import assertk.assertThat
import assertk.assertions.any
import assertk.assertions.isEqualTo
import assertk.assertions.prop
import kotlin.test.Test
class AssertkNestedAllSimpleTest {
@Test
fun `should not pass`() {
val key1 = "key1"
val value1 = "value1"
val key2 = "key2"
val value2 = "value2"
val map: Map<String, Collection<Any>> = mapOf(key1 to listOf(value1), key2 to setOf(value2))
assertThat(map.entries).all {
any {
it.all {
prop(Map.Entry<String, Any>::key).isEqualTo(key1) // assert 1
prop(Map.Entry<Any, Collection<Any>>::key).isEqualTo(value1) // assert 2
}
}
}
}
}
GitHub 带有完整代码的项目例如:https://github.com/bschelberg/assertk-test-issue
此测试失败。检查你的 assertThat 和 @Test 导入并检查它是否仍然通过 使用这些导入:
import assertk.all
import assertk.assertThat
import assertk.assertions.*
import assertk.fail
import org.junit.Test
并且这个 Maven 依赖项测试失败了。
<dependency>
<groupId>com.willowtreeapps.assertk</groupId>
<artifactId>assertk-jvm</artifactId>
<version>0.23</version>
<scope>test</scope>
</dependency>
这是 assertk 中的错误:https://github.com/willowtreeapps/assertk/issues/331。 any
块中出现不止一次故障时会出现此问题。
已在 v0.23.1 中修复