首页 > 解决方案 > assertk 测试不应该通过(嵌套 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了强制让它失败,但是测试还是通过了!奇怪的是,如果我从地图中删除第二个条目 ( key2and value2),那么测试确实会按预期失败。

我怀疑这可能与嵌套all的 s 和可能有关any,但我有理由这样设置它。为了保持示例小,我还有其他断言已被省略。

有没有人知道为什么这个测试在不应该通过的时候通过?


摇篮依赖:

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

带导入的测试类:

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

标签: kotlinassertk

解决方案


这个测试失败了。检查您的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>

推荐阅读