package com.rzg.zombieland.server.persistencia; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.Random; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.rzg.zombieland.comunes.misc.ParametrosNoValidosException; import com.rzg.zombieland.comunes.misc.ZombielandException; import com.rzg.zombieland.server.sesion.Jugador; /** * Arn�s b�sico para los tests de persistencia. Si se desea testear una nueva entidad, bastar� con * crear un test que herede de este clase para testear CRUD en la DB. * @author nicolas * * @param <T> - El tipo de objeto que se testea. * @param <T_ID> - El tipo de ID del objeto que se testea. */ public abstract class PersistenciaTest<T, T_ID extends Serializable> { /** * Constructor por defecto. */ public PersistenciaTest() { super(); } /** * Configura Hibernate para test. */ @Before public void before() { HibernateSingleton.setTest(); } /** * Cierra la conexi�n de Hibernate. */ @After public void after() { HibernateSingleton.cerrarConexion(); } /** * @return un objeto con valores aleatorios para persistir como test. * @throws ZombielandException */ protected abstract T generarObjeto() throws ParametrosNoValidosException; /** * Modifica valores del objeto aleatoriamente. * @param objeto * @throws ZombielandException */ protected abstract void actualizarObjeto(T objeto) throws ZombielandException; /** * @return el Dao correspondiente a este objeto. */ protected abstract Dao<T, T_ID> getDao(); /** * Devuelve el ID del objeto. * @param objeto */ protected abstract T_ID getIdObjeto(T objeto); /** * @return un jugador aleatorio. * @throws ParametrosNoValidosException */ protected Jugador generarJugador() throws ParametrosNoValidosException { Random random = new Random(); String clave = Integer.toString(random.nextInt()); return new Jugador(Integer.toString(random.nextInt()), clave, clave, Integer.toString(random.nextInt()), Integer.toString(random.nextInt())); } /** * Crea un jugador y lo trae de la DB. * @throws ParametrosNoValidosException */ @Test public void testCrearYRecuperarJugador() throws ParametrosNoValidosException { T objeto = generarObjeto(); Dao<T, T_ID> dao = getDao(); dao.guardarObjeto(objeto); dao.cerrarSesion(); T jugadorRecuperado = dao.getObjeto(getIdObjeto(objeto)); assertEquals(objeto, jugadorRecuperado); } /** * Guarda un conjunto de jugadores y los recupera a todos, verificando su existencia. * @throws ParametrosNoValidosException */ @Test public void testGetListadoJugadores() throws ParametrosNoValidosException { List<T> objetos = new ArrayList<T>(); Dao<T, T_ID> dao = getDao(); for (int i = 0; i < 10; i++) { objetos.add(generarObjeto()); dao.guardarObjeto(objetos.get(i)); } dao.cerrarSesion(); List<T> objetosRecuperados = dao.getListado(); dao.cerrarSesion(); assertEquals(objetos.size(), objetosRecuperados.size()); for (int i = 0; i < objetos.size(); i++) assertTrue(objetosRecuperados.contains(objetos.get(i))); } /** * Guarda un objeto en la DB, lo actualiza y luego lo recupera. * @throws ParametrosNoValidosException * @throws ZombielandException */ @Test public void testUpdateObjeto() throws ParametrosNoValidosException, ZombielandException { T objeto = generarObjeto(); Dao<T, T_ID> dao = getDao(); dao.guardarObjeto(objeto); dao.cerrarSesion(); actualizarObjeto(objeto); dao.actualizarObjeto(objeto); dao.cerrarSesion(); T objetoRecuperado = (T) dao.getObjeto(getIdObjeto(objeto)); assertEquals(objetoRecuperado, objeto); } }