Ir al contenido principal
Versión: 5.3.x

Matchers Compuestos

[Traducción Beta No Oficial]

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Se pueden crear matchers compuestos para cualquier class o interface combinando uno o más matchers junto con la propiedad a extraer para realizar las pruebas. Esto nos permite construir matchers complejos a partir de otros más simples.

Por ejemplo, supongamos que tenemos las siguientes estructuras:

data class Person(
val name: String,
val age: Int,
val address: Address,
)

data class Address(
val city: String,
val street: String,
val buildingNumber: String,
)

Y nuestro objetivo es tener un matcher Person que verifique personas en Varsovia. Podemos definir matchers para cada uno de esos componentes así:

fun nameMatcher(name: String) = Matcher<String> {
MatcherResult(
value == name,
{ "Name $value should be $name" },
{ "Name $value should not be $name" }
)
}

fun ageMatcher(age: Int) = Matcher<Int> {
MatcherResult(
value == age,
{ "Age $value should be $age" },
{ "Age $value should not be $age" }
)
}

val addressMatcher = Matcher<Address> {
MatcherResult(
value == Address("Warsaw", "Test", "1/1"),
{ "Address $value should be Test 1/1 Warsaw" },
{ "Address $value should not be Test 1/1 Warsaw" }
)
}

Ahora podemos combinar estos elementos para crear un matcher de "John en Varsovia". Observa que especificamos la propiedad a extraer para pasar a cada matcher secuencialmente.

fun personMatcher(name: String, age: Int) = Matcher.compose(
nameMatcher(name) to Person::name,
ageMatcher(age) to Person::age,
addressMatcher to Person::address
)

Y también podríamos añadir la variante de extensión:

fun Person.shouldBePerson(name: String, age: Int) = this shouldBe personMatcher(name, age)

Entonces lo invocamos así:

Person("John", 21, Address("Warsaw", "Test", "1/1")).shouldBePerson("John", 21)
Person("Sam", 22, Address("Chicago", "Test", "1/1")).shouldBePerson("John", 21) // would fail