#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 theany
. Внутри блока можно поместить несколько утверждений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