Abro este issue cómo discusión para que todos opinen, tengo dudas sobre lo siguiente:
Lo primero es que no termino de estar seguro de esta lógica de assertion en casos de uso como el 5
@Test
public void verificarQueSiRecibeUnPremioPorPrimeraVezObtieneUnCasco() {
....
//Assert
assertEquals(gladiador.obtenerEquipamiento(), inventarioDeEquipamiento.buscarPor(1));
No está abstraída de la implementación. Osea en verdad no estoy chequeando un comportamiento que está establecido por contrato, enunciado o caso de uso. Sino que estoy chequeando algo que se que va a ser así porque conozco la lógica interna de la clase.
Chequear que al decirle gladiador.obtenerEquipamiento()
, tengo que obtener lo mismo que inventarioDeEquipamiento.buscarPor(1)
, requiere saber cuánto mínimo saber que gladiador hace un this.inventario.agregarSiNoExiste(equipamiento);
. También requiere conocer la lógica interna de buscarPor(1)
cuando mínimo para saber qué buscarPor(1) retorna el Casco porque está implementado con un ArrayList<>() donde ya el lugar 0 está ocupado por SinEquipamiento
.
Finalmente vale añadir que si deseamos deshacernos de getter innecesarios (aquellos utilizados sólo para testear) entonces seguiríamos en un problema al intentar quitar gladiador.obtenerEquipamiento()
.
Una forma posible de testear estos casos, testeando consecuencias en el comportamientos y aprovechando que no se trata de un test unitario seria, ver que sucede si es atacado por un fiera ahora que posee un equipamiento superior
@Test
public void verificarQueSiRecibeUnPremioPorPrimeraVezObtieneUnCasco() {
....
//Assert
// un gladiador con casco pierde 15 puntos de energía frente al ataque de una fiera
fiera.afectarGladiador(gladiador)
assertEquals(gladiador.getEnergia(), 5);
Pero bueno, tampoco estoy tan seguro por eso lo abro como discusión