тест assertk не должен проходить (вложенные все / любые?)

#kotlin #assertk

#kotlin #assertk

Вопрос:

У меня есть тест, который должен пройти, но не проходит, и в процессе разработки небольшого тестового примера, демонстрирующего поведение, я сделал тест, который не должен проходить, но проходит. Это тест:

 @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 s и, возможно any , с, но у меня есть причина для такой настройки. У меня есть другие утверждения, которые были опущены в интересах сохранения небольшого размера примера.

Кто-нибудь имеет представление о том, почему этот тест проходит, когда он не должен?

  • версия assertk 0.23
  • версия junit 5.7.0
  • версия kotlin 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")
 

Тестовый класс с импортом:

 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

Комментарии:

1. Просто примечание о реализации этого теста: нет необходимости в all inside the any . Внутри блока можно поместить несколько утверждений any , и это работает так же, как при использовании явного all блока.

Ответ №1:

этот тест завершается неудачей. проверьте ваш импорт 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>
 

Комментарии:

1. Спасибо за ответ. Я проверил свой импорт и зависимости, я не вижу там ничего неправильного. Я добавил их в свой вопрос на случай, если мне чего-то не хватает.

Ответ №2:

Это была ошибка в assertk: https://github.com/willowtreeapps/assertk/issues/331 . Проблема возникла, когда в блоке было более одного сбоя any .

Это исправлено в версии 0.23.1