Commit inicial

This commit is contained in:
Isidoro Nevares Martín 2026-05-27 12:07:47 +02:00
commit b074794e82
19 changed files with 1062 additions and 0 deletions

7
.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
/bin/
*.class
/target/
# Eclipse
.classpath
.project
.settings/

4
README.md Normal file
View File

@ -0,0 +1,4 @@
# Repositorio para el examen de ORDINARIA de Ampliación de Entornos (RA3-RA4-RA5).
¡Ánimo y a por ello!

68
pom.xml Normal file
View File

@ -0,0 +1,68 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.lapaloma.examen.aaee</groupId>
<artifactId>aaee_gobierno</artifactId>
<version>0.0.2</version>
<name>Prueba de Springboot</name>
<description>Proyecto para poder probar el funcionamiento de SpringBoot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>4.0.1</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>23</java.version>
<junit.version>6.0.3</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- JDBC starter: activa DataSource y HikariCP -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- Starter test: incluye JUnit 5, Mockito, AssertJ, etc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Source: https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>9.7.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,14 @@
package org.lapaloma.examen.aaee;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AppGobiernoSB {
public static void main(String[] args) {
SpringApplication.run(AppGobiernoSB.class, args);
}
}

View File

@ -0,0 +1,63 @@
package org.lapaloma.examen.aaee.controller;
import java.util.List;
import org.lapaloma.examen.aaee.service.MiembroService;
import org.lapaloma.examen.aaee.vo.Miembro;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Controlador REST para gestionar miembros de ministerios
*
* @author Isidoro Nevares Martín - IES Virgen de la Paloma
* @date 08 mayo 2026
*/
@RestController
@RequestMapping("/gobierno_ord/miembros")
public class MiembroController {
private final MiembroService miembroService;
// Spring inyecta automáticamente el service con su DAO
public MiembroController(MiembroService miembroService) {
this.miembroService = miembroService;
}
/**
* GET /gobierno_ord/miembros - Obtiene la lista de todos los miembros
*
* @return List<Miembro> lista de todos los miembros en formato JSON
*/
@GetMapping
public List<Miembro> getAll() {
List<Miembro> listaMiembros = miembroService.obtenerListaMiembros();
return listaMiembros;
}
/**
* GET /gobierno_ord/miembros/nombre/{nombre} - Obtiene un miembro por su nombre
*
* @param nombre el nombre del miembro a buscar
* @return Miembro el miembro encontrado en formato JSON
*/
@GetMapping("/nombre/{nombre}")
public Miembro getByNombre(@PathVariable String nombre) {
Miembro miembro = miembroService.obtenerMiembroPorNombre(nombre);
return miembro;
}
/**
* GET /gobierno_ord/miembros/alias/{alias} - Obtiene un miembro por su alias
*
* @param alias el alias del miembro a buscar
* @return Miembro el miembro encontrado en formato JSON
*/
@GetMapping("/alias/{alias}")
public Miembro getByAlias(@PathVariable String alias) {
Miembro miembro = miembroService.obtenerMiembroPorAlias(alias);
return miembro;
}
}

View File

@ -0,0 +1,49 @@
/**
*
*/
package org.lapaloma.examen.aaee.controller;
import java.util.List;
import org.lapaloma.examen.aaee.service.MinisterioService;
import org.lapaloma.examen.aaee.vo.Ministerio;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Isidoro Nevares Martín - Virgen de la Paloma Fecha creación: 13 mar 2026
*/
@RestController
@RequestMapping("/gobierno_ord/ministerios")
public class MinisterioController {
private final MinisterioService ministerioService;
// Spring inyecta automáticamente el service con su DAO
public MinisterioController(MinisterioService ministerioService) {
this.ministerioService = ministerioService;
}
// GET /gobierno_ord/ministerios - listar todos los ministerios
@GetMapping
public List<Ministerio> getAll() {
List<Ministerio> listaMinisterios = ministerioService.obtenerListaMinisterios();
return listaMinisterios;
}
// GET /gobierno_ord/ministerios/nombre/{nombre} - obtener un ministerio por nombre
@GetMapping("/nombre/{nombre}")
public Ministerio getByNombre(@PathVariable String nombre) {
Ministerio ministerio = ministerioService.obtenerMinisterioPorNombre(nombre);
return ministerio;
}
// GET /gobierno_ord/ministerios/id/{id} - obtener un ministerio por identificador
@GetMapping("/id/{id}")
public Ministerio getByIdentificador(@PathVariable int id) {
Ministerio ministerio = ministerioService.obtenerMinisterioPorIdentificador(id);
return ministerio;
}
}

View File

@ -0,0 +1,14 @@
package org.lapaloma.examen.aaee.dao;
import java.util.List;
import org.lapaloma.examen.aaee.vo.Miembro;
public interface IMiembroDAO {
public List<Miembro> obtenerListaMiembros();
public Miembro obtenerMiembroPorNombre(String nombre);
public Miembro obtenerMiembroPorAlias(String alias);
}

View File

@ -0,0 +1,14 @@
package org.lapaloma.examen.aaee.dao;
import java.util.List;
import org.lapaloma.examen.aaee.vo.Ministerio;
public interface IMinisterioDAO {
public List<Ministerio> obtenerListaMinisterios();
public Ministerio obtenerMinisterioPorNombre(String nombre);
public Ministerio obtenerMinisterioPorIdentificador(int identificador);
}

View File

@ -0,0 +1,129 @@
package org.lapaloma.examen.aaee.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import org.lapaloma.examen.aaee.dao.IMiembroDAO;
import org.lapaloma.examen.aaee.vo.Miembro;
import org.lapaloma.examen.aaee.vo.Ministerio;
import org.springframework.stereotype.Repository;
@Repository
public class MiembroDaoJDBC implements IMiembroDAO {
private final DataSource dataSource;
// Spring inyecta el DataSource configurado automáticamente
public MiembroDaoJDBC(DataSource dataSource) {
this.dataSource = dataSource;
}
@Override
public List<Miembro> obtenerListaMiembros() {
List<Miembro> lista = new ArrayList<>();
String sentenciaSQL = """
SELECT * FROM miembro
""";
try (Connection conexion = dataSource.getConnection();
PreparedStatement sentenciaJDBCPreparada = conexion.prepareStatement(sentenciaSQL);) {
System.out.println(sentenciaJDBCPreparada);
ResultSet resultadoSentencia = sentenciaJDBCPreparada.executeQuery();
while (resultadoSentencia.next()) {
lista.add(getLineaFromResultSet(resultadoSentencia));
}
} catch (Exception e) {
e.printStackTrace();
}
return lista;
}
@Override
public Miembro obtenerMiembroPorNombre(String nombre) {
String sentenciaSQL = """
SELECT * FROM miembro WHERE nombre = ?
""";
try (Connection conexion = dataSource.getConnection();
PreparedStatement sentenciaJDBCPreparada = conexion.prepareStatement(sentenciaSQL);) {
sentenciaJDBCPreparada.setString(1, nombre);
System.out.println(sentenciaJDBCPreparada);
ResultSet resultadoSentencia = sentenciaJDBCPreparada.executeQuery();
if (resultadoSentencia.next()) {
return getLineaFromResultSet(resultadoSentencia);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public Miembro obtenerMiembroPorAlias(String alias) {
String sentenciaSQL = """
SELECT * FROM miembro WHERE alias = ?
""";
try (Connection conexion = dataSource.getConnection();
PreparedStatement sentenciaJDBCPreparada = conexion.prepareStatement(sentenciaSQL);) {
sentenciaJDBCPreparada.setString(1, alias);
System.out.println(sentenciaJDBCPreparada);
ResultSet resultadoSentencia = sentenciaJDBCPreparada.executeQuery();
if (resultadoSentencia.next()) {
return getLineaFromResultSet(resultadoSentencia);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private Miembro getLineaFromResultSet(ResultSet resultadoSentencia) throws SQLException {
Miembro miembro = new Miembro();
miembro.setIdentificador(resultadoSentencia.getInt("codMiembro"));
miembro.setNif(resultadoSentencia.getString("nif"));
miembro.setNombre(resultadoSentencia.getString("nombre"));
miembro.setApellido1(resultadoSentencia.getString("apellido1"));
miembro.setAlias(resultadoSentencia.getString("alias"));
// Obtener el código del ministerio
int codigoMinisterio = resultadoSentencia.getInt("codigoMinisterio");
// Si codigoMinisterio es válido (no es 0), crear objeto Ministerio
if (codigoMinisterio != 0) {
Ministerio ministerio = new Ministerio();
ministerio.setIdentificador(codigoMinisterio);
miembro.setMinisterio(ministerio);
}
return miembro;
}
}

View File

@ -0,0 +1,98 @@
package org.lapaloma.examen.aaee.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import org.lapaloma.examen.aaee.dao.IMinisterioDAO;
import org.lapaloma.examen.aaee.vo.Ministerio;
import org.springframework.stereotype.Repository;
@Repository
public class MinisterioDaoJDBC implements IMinisterioDAO {
private final DataSource dataSource;
// Spring inyecta el DataSource configurado automáticamente
public MinisterioDaoJDBC(DataSource dataSource) {
this.dataSource = dataSource;
}
@Override
public List<Ministerio> obtenerListaMinisterios() {
List<Ministerio> lista = new ArrayList<>();
String sentenciaSQL = """
SELECT * FROM ministerio
""";
try (Connection conexion = dataSource.getConnection();
PreparedStatement sentenciaJDBCPreparada = conexion.prepareStatement(sentenciaSQL);) {
System.out.println(sentenciaJDBCPreparada);
ResultSet resultadoSentencia = sentenciaJDBCPreparada.executeQuery();
while (resultadoSentencia.next()) {
lista.add(getLineaFromResultSet(resultadoSentencia));
}
} catch (Exception e) {
e.printStackTrace();
}
return lista;
}
private Ministerio getLineaFromResultSet(ResultSet resultadoSentencia) throws SQLException {
Ministerio ministerio = new Ministerio();
ministerio.setIdentificador(resultadoSentencia.getInt("codMinisterio"));
ministerio.setNombre(resultadoSentencia.getString("nombre"));
ministerio.setPresupuesto(resultadoSentencia.getDouble("presupuesto"));
ministerio.setGastos(resultadoSentencia.getDouble("gastos"));
return ministerio;
}
private Ministerio obtenerMinisterio(String sentenciaSQL, Object parametro) {
try (Connection conexion = dataSource.getConnection();
PreparedStatement sentenciaJDBCPreparada = conexion.prepareStatement(sentenciaSQL);) {
sentenciaJDBCPreparada.setObject(1, parametro);
System.out.println(sentenciaJDBCPreparada);
try (ResultSet resultadoSentencia = sentenciaJDBCPreparada.executeQuery()) {
if (resultadoSentencia.next()) {
return getLineaFromResultSet(resultadoSentencia);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
public Ministerio obtenerMinisterioPorNombre(String nombre) {
String sentenciaSQL = "SELECT * FROM ministerio WHERE nombre = ?";
return obtenerMinisterio(sentenciaSQL, nombre);
}
@Override
public Ministerio obtenerMinisterioPorIdentificador(int identificador) {
String sentenciaSQL = "SELECT * FROM ministerio WHERE codMinisterio = ?";
return obtenerMinisterio(sentenciaSQL, identificador);
}
}

View File

@ -0,0 +1,12 @@
package org.lapaloma.examen.aaee.excepcion;
public class MiembroNoEncontradoException extends RuntimeException {
/**
*
*/
private static final long serialVersionUID = -3344627619585104665L;
public MiembroNoEncontradoException(String mensaje) {
super(mensaje);
}
}

View File

@ -0,0 +1,12 @@
package org.lapaloma.examen.aaee.excepcion;
public class MinisterioNoEncontradoException extends RuntimeException {
/**
*
*/
private static final long serialVersionUID = -3344627619585104664L;
public MinisterioNoEncontradoException(String mensaje) {
super(mensaje);
}
}

View File

@ -0,0 +1,76 @@
package org.lapaloma.examen.aaee.service;
import java.util.List;
import org.lapaloma.examen.aaee.dao.IMiembroDAO;
import org.lapaloma.examen.aaee.excepcion.MiembroNoEncontradoException;
import org.lapaloma.examen.aaee.vo.Miembro;
import org.springframework.stereotype.Service;
@Service
public class MiembroService {
private final IMiembroDAO miembroDAO;
// Spring inyecta el DAO automáticamente
public MiembroService(IMiembroDAO miembroDAO) {
this.miembroDAO = miembroDAO;
}
/**
* Obtiene la lista completa de miembros
*
* @return List<Miembro> lista de todos los miembros
* @throws RuntimeException si la lista está vacía
*/
public List<Miembro> obtenerListaMiembros() {
List<Miembro> lista = miembroDAO.obtenerListaMiembros();
// Simulamos el caso de lista vacía para probar la excepción
lista=null;
if (lista == null || lista.isEmpty()) {
throw new RuntimeException("No hay miembros disponibles");
}
return lista;
}
/**
* Obtiene un miembro por su nombre
*
* @param nombre el nombre del miembro a buscar
* @return Miembro el miembro encontrado
* @throws MiembroNoEncontradoException si no se encuentra el miembro
*/
public Miembro obtenerMiembroPorNombre(String nombre) {
Miembro miembro = miembroDAO.obtenerMiembroPorNombre(nombre);
if (miembro == null) {
throw new MiembroNoEncontradoException("Miembro con nombre '" + nombre + "' no encontrado");
}
return miembro;
}
/**
* Obtiene un miembro por su alias
*
* @param alias el alias del miembro a buscar
* @return Miembro el miembro encontrado
* @throws MiembroNoEncontradoException si no se encuentra el miembro
*/
public Miembro obtenerMiembroPorAlias(String alias) {
Miembro miembro = miembroDAO.obtenerMiembroPorAlias(alias);
if (miembro == null) {
throw new MiembroNoEncontradoException("Miembro con alias '" + alias + "' no encontrado");
}
return miembro;
}
}

View File

@ -0,0 +1,60 @@
/**
*
*/
package org.lapaloma.examen.aaee.service;
import java.util.List;
import org.lapaloma.examen.aaee.dao.IMinisterioDAO;
import org.lapaloma.examen.aaee.excepcion.MinisterioNoEncontradoException;
import org.lapaloma.examen.aaee.vo.Ministerio;
import org.springframework.stereotype.Service;
@Service
public class MinisterioService {
private final IMinisterioDAO ministerioDAO;
// Spring inyecta el DAO automáticamente
public MinisterioService(IMinisterioDAO ministerioDAO) {
this.ministerioDAO = ministerioDAO;
}
public List<Ministerio> obtenerListaMinisterios() {
List<Ministerio> lista = ministerioDAO.obtenerListaMinisterios();
// Simulamos el caso de lista vacía para probar la excepción
lista=null;
if (lista == null || lista.isEmpty()) {
throw new RuntimeException("No hay ministerios disponibles");
}
return lista;
}
public Ministerio obtenerMinisterioPorNombre(String nombre) {
Ministerio ministerio = ministerioDAO.obtenerMinisterioPorNombre(nombre);
if (ministerio == null) {
throw new MinisterioNoEncontradoException("Ministerio con nombre '" + nombre + "' no encontrado");
}
return ministerio;
}
public Ministerio obtenerMinisterioPorIdentificador(int identificador) {
Ministerio ministerio = ministerioDAO.obtenerMinisterioPorIdentificador(identificador);
// Simulamos el caso de lista vacía para probar la excepción
ministerio=null;
if (ministerio == null) {
throw new MinisterioNoEncontradoException("Ministerio con identificador '" + identificador + "' no encontrado");
}
return ministerio;
}
}

View File

@ -0,0 +1,88 @@
package org.lapaloma.examen.aaee.vo;
/**
*
* Casa: Clase de persistencia que representa un Miembro de un Ministerio.
*
* @author Isidoro Nevares Martín - IES Virgen de la Paloma
* @date 03 marzo 2026
*
*
*/
public class Miembro {
private int identificador;
private String nif;
private String nombre;
private String apellido1;
private String alias;
private Ministerio ministerio;
public Miembro() {
super();
}
public Miembro(int identificador, String nif, String nombre, String apellido1, String alias,
Ministerio ministerio) {
super();
this.identificador = identificador;
this.nif = nif;
this.nombre = nombre;
this.apellido1 = apellido1;
this.alias = alias;
this.ministerio = ministerio;
}
public int getIdentificador() {
return identificador;
}
public void setIdentificador(int identificador) {
this.identificador = identificador;
}
public String getNif() {
return nif;
}
public void setNif(String nif) {
this.nif = nif;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApellido1() {
return apellido1;
}
public void setApellido1(String apellido1) {
this.apellido1 = apellido1;
}
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
public Ministerio getMinisterio() {
return ministerio;
}
public void setMinisterio(Ministerio ministerio) {
this.ministerio = ministerio;
}
@Override
public String toString() {
return "Miembro [identificador=" + identificador + ", nif=" + nif + ", nombre=" + nombre + ", apellido1="
+ apellido1 + ", alias=" + alias + ", ministerio=" + ministerio + "]";
}
}

View File

@ -0,0 +1,70 @@
package org.lapaloma.examen.aaee.vo;
/**
*
* Casa: Clase de persistencia que representa una Ministerio de Gobierno.
*
* @author Isidoro Nevares Martín - IES Virgen de la Paloma
* @date 03 marzo 2026
*
*
*/
public class Ministerio {
private int identificador;
private String nombre;
private double presupuesto;
private double gastos;
/**
* @param identificador
* @param nombre
*/
public Ministerio(int identificador, String nombre, double presupuesto, double gastos) {
super();
this.identificador = identificador;
this.nombre = nombre;
this.presupuesto = presupuesto;
this.gastos = gastos;
}
public double getPresupuesto() {
return presupuesto;
}
public void setPresupuesto(double presupuesto) {
this.presupuesto = presupuesto;
}
public double getGastos() {
return gastos;
}
public void setGastos(double gastos) {
this.gastos = gastos;
}
public Ministerio() {
}
public int getIdentificador() {
return identificador;
}
public void setIdentificador(int identificador) {
this.identificador = identificador;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
@Override
public String toString() {
return "Casa [identificador=" + identificador + ", nombre=" + nombre + "]";
}
}

View File

@ -0,0 +1,13 @@
# Puerto en que escucha Spring Boot
server.port=8080
# Servicio de la base de datos.
# Ejemplo url base dator:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://${DB_HOST:192.168.1.36}:${DB_PORT:3306}/${DB_NAME:Gobierno}
spring.datasource.username=${DB_USER:root}
spring.datasource.password=${DB_PASSWORD:mysql_123}
# Parámetros del Pool de conexiones HikariCP
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=2

View File

@ -0,0 +1,151 @@
package org.lapaloma.examen.aaee.service;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.lapaloma.examen.aaee.dao.IMiembroDAO;
import org.lapaloma.examen.aaee.excepcion.MiembroNoEncontradoException;
import org.lapaloma.examen.aaee.vo.Miembro;
import org.lapaloma.examen.aaee.vo.Ministerio;
class MiembroServiceTest {
private MiembroService miembroService;
private FakeMiembroDAO fakeDAO;
@BeforeEach
void setUp() {
fakeDAO = new FakeMiembroDAO();
miembroService = new MiembroService(fakeDAO);
}
// =========================
// obtenerListaMiembros
// =========================
@Test
void obtenerListaMiembros_cuandoListaEstaVacia_lanzaExcepcion() {
assertThrows(RuntimeException.class, () -> {
miembroService.obtenerListaMiembros();
});
}
@Test
void obtenerListaMiembros_cuandoHayDatos_retornaLista() {
Ministerio ministerio = new Ministerio(1, "Ministerio de Defensa", 120000, 6000);
Miembro miembro1 = new Miembro(1, "23451596F", "James", "Logan", "Lobezno", ministerio);
fakeDAO.data.add(miembro1);
List<Miembro> resultado = miembroService.obtenerListaMiembros();
assertNotNull(resultado);
assertEquals(1, resultado.size());
assertEquals("James", resultado.get(0).getNombre());
}
// =========================
// obtenerMiembroPorNombre
// =========================
@Test
void obtenerMiembroPorNombre_cuandoNoExiste_lanzaExcepcion() {
assertThrows(MiembroNoEncontradoException.class, () -> {
miembroService.obtenerMiembroPorNombre("NoExiste");
});
}
@Test
void obtenerMiembroPorNombre_cuandoExiste_retornaMiembro() {
Ministerio ministerio = new Ministerio(1, "Ministerio de Defensa", 120000, 6000);
Miembro miembro1 = new Miembro(1, "23451596F", "James", "Logan", "Lobezno", ministerio);
fakeDAO.data.add(miembro1);
Miembro resultado = miembroService.obtenerMiembroPorNombre("James");
assertNotNull(resultado);
assertEquals("James", resultado.getNombre());
assertEquals("Logan", resultado.getApellido1());
assertEquals("Lobezno", resultado.getAlias());
}
// =========================
// obtenerMiembroPorAlias
// =========================
@Test
void obtenerMiembroPorAlias_cuandoNoExiste_lanzaExcepcion() {
assertThrows(MiembroNoEncontradoException.class, () -> {
miembroService.obtenerMiembroPorAlias("AliasNoExiste");
});
}
@Test
void obtenerMiembroPorAlias_cuandoExiste_retornaMiembro() {
Ministerio ministerio = new Ministerio(1, "Ministerio de Defensa", 120000, 6000);
Miembro miembro1 = new Miembro(1, "23451596F", "James", "Logan", "Lobezno", ministerio);
fakeDAO.data.add(miembro1);
Miembro resultado = miembroService.obtenerMiembroPorAlias("Lobezno");
assertNotNull(resultado);
assertEquals("James", resultado.getNombre());
assertEquals("Lobezno", resultado.getAlias());
}
@Test
void obtenerMiembroPorAlias_cuandoAliasEsNull_manejaCorrectamente() {
Ministerio ministerio = new Ministerio(2, "Ministerio de Economía", 375000, 38000);
Miembro miembro1 = new Miembro(3, "36974641B", "Tío", "Gilito", null, ministerio);
fakeDAO.data.add(miembro1);
// Buscar un alias null debería lanzar excepción
assertThrows(MiembroNoEncontradoException.class, () -> {
miembroService.obtenerMiembroPorAlias(null);
});
}
// =========================
// FakeMiembroDAO
// =========================
static class FakeMiembroDAO implements IMiembroDAO {
private List<Miembro> data = new ArrayList<>();
@Override
public List<Miembro> obtenerListaMiembros() {
return new ArrayList<>(data);
}
@Override
public Miembro obtenerMiembroPorNombre(String nombre) {
return data.stream()
.filter(m -> m.getNombre().equals(nombre))
.findFirst()
.orElse(null);
}
@Override
public Miembro obtenerMiembroPorAlias(String alias) {
return data.stream()
.filter(m -> {
String miembroAlias = m.getAlias();
return miembroAlias != null && miembroAlias.equals(alias);
})
.findFirst()
.orElse(null);
}
}
}

View File

@ -0,0 +1,120 @@
package org.lapaloma.examen.aaee.service;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.lapaloma.examen.aaee.dao.IMinisterioDAO;
import org.lapaloma.examen.aaee.excepcion.MinisterioNoEncontradoException;
import org.lapaloma.examen.aaee.service.MinisterioService;
import org.lapaloma.examen.aaee.vo.Ministerio;
class MinisterioServiceTest {
private MinisterioService ministerioService;
private FakeMinisterioDAO fakeDAO;
@BeforeEach
void setUp() {
fakeDAO = new FakeMinisterioDAO();
ministerioService = new MinisterioService(fakeDAO);
}
// =========================
// obtenerListaMinisterios
// =========================
@Test
void obtenerListaMinisterios_cuandoListaEstaVacio_lanzaExcepcion() {
assertThrows(RuntimeException.class, () -> {
ministerioService.obtenerListaMinisterios();
});
}
@Test
void obtenerListaMinisterio_cuandoHayDatos_retornaLista() {
fakeDAO.data.add(new Ministerio(1, "Ministerio de Defensa", 120000, 100000));
List<Ministerio> resultado = ministerioService.obtenerListaMinisterios();
assertNotNull(resultado);
assertEquals(1, resultado.size());
}
// =========================
// obtenerMinisterioPorNombre
// =========================
@Test
void obtenerMinisterioPorNombre_cuandoNoExiste_lanzaExcepcion() {
assertThrows(MinisterioNoEncontradoException.class, () -> {
ministerioService.obtenerMinisterioPorNombre("NoExiste");
});
}
@Test
void obtenerMinisterioPorNombre_cuandoExiste_retornaMinisterio() {
fakeDAO.data.add(new Ministerio(1, "Ministerio de Defensa", 120000, 100000));
Ministerio resultado = ministerioService.obtenerMinisterioPorNombre("Ministerio de Defensa");
assertNotNull(resultado);
assertEquals(1, resultado.getIdentificador());
assertEquals("Ministerio de Defensa", resultado.getNombre());
}
// =========================
// obtenerMinisterioPorIdentificador
// =========================
@Test
void obtenerMinisterioPorIdentificador_cuandoNoExiste_lanzaExcepcion() {
assertThrows(MinisterioNoEncontradoException.class, () -> {
ministerioService.obtenerMinisterioPorIdentificador(99);
});
}
@Test
void obtenerMinisterioPorIdentificador_cuandoExiste_retornaMinisterio() {
fakeDAO.data.add(new Ministerio(2, "Ministerio de Economía", 375000, 38000));
Ministerio resultado = ministerioService.obtenerMinisterioPorIdentificador(2);
assertNotNull(resultado);
assertEquals(2, resultado.getIdentificador());
assertEquals("Ministerio de Economía", resultado.getNombre());
}
static class FakeMinisterioDAO implements IMinisterioDAO {
private List<Ministerio> data = new ArrayList<>();
@Override
public List<Ministerio> obtenerListaMinisterios() {
return new ArrayList<>(data);
}
@Override
public Ministerio obtenerMinisterioPorNombre(String nombre) {
return data.stream()
.filter(m -> m.getNombre().equals(nombre))
.findFirst()
.orElse(null);
}
@Override
public Ministerio obtenerMinisterioPorIdentificador(int identificador) {
return data.stream()
.filter(m -> m.getIdentificador() == identificador)
.findFirst()
.orElse(null);
}
}
}