Índice de temario
Día | Tema a tratar |
---|---|
1 | Definiendo objetivos |
2 | Proyecto inicial y value objects |
3 | Tratando con excepciones |
4 | Validando con Enum y parametrized test |
5 | Ampliando uso del Enum |
6 | Entidades |
Día 3. Tratando con Excepciones
Anteriormente, nuestro Value object validaba que el valor fuera el correcto. Pero usamos una excepción genérica, la cual sólo nos deja poner un mensaje. Esto puede estar bien, pero en el contexto de DDD no es del todo correcto. La idea es que a través de la estructura de carpetas y los ficheros que tenemos, podamos hacernos una idea del dominio.
En este caso, es más acertado gestionar una excepción personalizada. Y en un futuro, podremos controlar mejor dichas excepciones en nuestro flujo.
Con lo que, vamos a cambiar el test que espera la excepción y vamos a ser más explícitos.
...
internal class YMowerPositionTest
{
...
@Test
fun `Should throw exception for invalid values` ()
{
assertThrows(InvalidMowerPositionException::class.java) {
YMowerPosition.build(INVALID_POSITION)
}
}
}
Y para crear la excepción, usaremos un test para la InvalidMowerPositionException.
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Assertions.*
import kotlin.test.Test
private const val POSITION: Int = 4;
private const val MESSAGE: String = "Invalid Y position $POSITION. Only positive values are valid."
internal class InvalidMowerPositionExceptionTest
{
@Test
fun `Should be build with custom value`() {
val exception = assertThrows(InvalidMowerPositionException::class.java) {
throw InvalidMowerPositionException.withValue(POSITION)
}
assertThat(exception.message).isEqualTo(MESSAGE)
}
}
Y su código que lo implementa.
class InvalidMowerPositionException private constructor (message: String? = null, cause: Throwable? = null) : Exception(message, cause) {
companion object {
private const val MESSAGE: String = "Invalid Y position %d. Only positive values are valid."
@JvmStatic
fun withValue(value: Int): InvalidMowerPositionException
{
return InvalidMowerPositionException(String.format(MESSAGE, value), null)
}
}
}
Esta vez hemos ido más rápidos creando esta clase. Conocemos un poco mejor cómo hacerlo y no tiene mayor complejidad.
Consejo
Si miráis más en detalle, a la hora de crear el mensaje, el test usa una concatenación simple y la excepción un String.format(). Eso está hecho adrede para evitar hacer copy/paste del test a la implementación. Así nos aseguramos que el resultado es el esperado.
Links y recursos
Exceptions
https://kotlinlang.org/docs/exceptions.html?q=con#exception-classes
Share this post
Twitter
Facebook
Reddit
LinkedIn
Email