2 minute read

Í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.


Exceptions

https://kotlinlang.org/docs/exceptions.html?q=con#exception-classes


comments powered by Disqus