commit edbd3bdded47ac34de3ec2b455234c035d3661a6 Author: Isidoro Nevares Martín Date: Mon Mar 16 10:47:22 2026 +0100 Commit inicial diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..85810bf --- /dev/null +++ b/.classpath @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..93e00af --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/bin/ +*.class +/target/ diff --git a/.project b/.project new file mode 100644 index 0000000..581b298 --- /dev/null +++ b/.project @@ -0,0 +1,34 @@ + + + eedd_ra3_ejemplo4 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + + + 1772465433562 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.apt.core.prefs b/.settings/org.eclipse.jdt.apt.core.prefs new file mode 100644 index 0000000..d4313d4 --- /dev/null +++ b/.settings/org.eclipse.jdt.apt.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.apt.aptEnabled=false diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..1b6e1ef --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.processAnnotations=disabled +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/README.md b/README.md new file mode 100644 index 0000000..d4a2f7a --- /dev/null +++ b/README.md @@ -0,0 +1,127 @@ +# JUnit 5 – Conceptos básicos + +--- + +## 1. Anotaciones esenciales de JUnit 5 + +JUnit 5 usa anotaciones para indicar qué métodos son tests y cómo preparar o limpiar el entorno. + +| Anotación | Cuándo se ejecuta | Para qué sirve | +|---|---|---| +| `@Test` | En cada test | Marca un método como test | +| `@BeforeEach` | Antes de cada test | Preparar el estado común (crear objetos, etc.) | +| `@AfterEach` | Después de cada test | Limpiar recursos (cerrar conexiones, etc.) | +| `@BeforeAll` | Una vez antes de todos | Inicializar recursos costosos (se ejecuta una sola vez) | +| `@AfterAll` | Una vez después de todos | Liberar recursos globales | + +> **Nota:** Los métodos `@BeforeAll` y `@AfterAll` deben ser `static`. + +### Ejemplo + +```java +class AlumnoServiceTest { + + private AlumnoService service; + + @BeforeEach + void setUp() { + service = new AlumnoService(); // Se ejecuta antes de cada @Test + } + + @Test + void telefonoDe9DigitosEsValido() { + // ... + } + + @Test + void telefonoVacioNoEsValido() { + // ... + } +} +``` + +En este ejemplo, `setUp()` crea una instancia nueva de `AlumnoService` antes de **cada** test, garantizando que los tests son independientes entre sí. + +--- + +## 2. Nomenclatura de los tests + +El nombre del método de test es muy importante: cuando un test falla, el nombre es lo primero que se lee. + +### Convención recomendada + +``` +metodo_cuandoCondicion_retornaResultado() +``` + +| Parte | Significado | +|---|---| +| `metodo` | El método que se está probando | +| `cuandoCondicion` | La situación o entrada que se usa | +| `retornaResultado` | Lo que se espera que ocurra | + +### Ejemplos + +```java +// ✅ Nombres descriptivos +@Test +void telefonoValido_cuandoTiene9Digitos_retornaTrue() { ... } + +@Test +void telefonoValido_cuandoEstaVacio_retornaFalse() { ... } + +@Test +void telefonoValido_cuandoTieneLetras_retornaFalse() { ... } + +// ❌ Nombres que no dicen nada +@Test +void test1() { ... } + +@Test +void pruebaTest() { ... } +``` + +Con nombres descriptivos, si falla `telefonoValido_cuandoTiene9Digitos_retornaTrue` sabemos exactamente qué está fallando sin ni siquiera abrir el código. + +--- + +## 3. Given – When – Then (G-W-T) + +El patrón **Given-When-Then** es una forma de estructurar los tests que viene del enfoque **BDD (Behavior Driven Development)**. Es equivalente al patrón AAA pero con una terminología más orientada al comportamiento. + +| Fase | Significado | Equivalente AAA | +|---|---|---| +| **Given** | Dado un contexto inicial | Arrange | +| **When** | Cuando ocurre una acción | Act | +| **Then** | Entonces se produce un resultado | Assert | + +### Ejemplo + +```java +@Test +void telefonoValido_cuandoTiene9Digitos_retornaTrue() { + + // Given + Alumno alumno = new Alumno(); + alumno.setTelefono("123456789"); + + // When + boolean resultado = service.telefonoValido(alumno); + + // Then + assertTrue(resultado); +} +``` + +La ventaja de G-W-T es que el test **se lee casi como una frase en lenguaje natural**: + +> *Dado un alumno con teléfono de 9 dígitos, cuando compruebo si es válido, entonces el resultado es verdadero.* + +Esto facilita que cualquier componente del equipo, incluso sin conocimientos técnicos, entienda qué se está probando. + + +![Diagrama de pruebas](img/junit_test_flowchart.svg) + + +--- +Fuentes: [ChatGPT](https://chat.openai.com) + [Claude](https://claude.ai) \ No newline at end of file diff --git a/img/junit_test_flowchart.svg b/img/junit_test_flowchart.svg new file mode 100644 index 0000000..5e6244e --- /dev/null +++ b/img/junit_test_flowchart.svg @@ -0,0 +1,98 @@ + + + + + + + + + Ciclo de vida de un test con JUnit 5 + + + + + @BeforeAll + Una vez antes de todos los tests + + + + + + + + por cada @Test + + + + + @BeforeEach + Prepara el estado inicial + + + + + + + + @Test + + + + Given + Preparar objetos y datos + + + + When + Llamar al método a probar + + + + Then + Verificar el resultado esperado + + + + + + + + + @AfterEach + Limpia recursos tras el test + + + + + repetir + + + + + + + @AfterAll + Una vez al finalizar todos + + + + + Equivalencia de patrones + + + + + + + Given – When – Then + + + + Arrange – Act – Assert + + + Given → When → Then + Arrange → Act → Assert + = misma idea, distinta terminología + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..ec0b103 --- /dev/null +++ b/pom.xml @@ -0,0 +1,7 @@ + + 4.0.0 + org.lapaloma.concesionario + aadd_concesionario + 0.0.1-SNAPSHOT + + \ No newline at end of file diff --git a/src/main/java/org/lapaloma/hogwarts/AppHogwarts.java b/src/main/java/org/lapaloma/hogwarts/AppHogwarts.java new file mode 100644 index 0000000..af31578 --- /dev/null +++ b/src/main/java/org/lapaloma/hogwarts/AppHogwarts.java @@ -0,0 +1,22 @@ +package org.lapaloma.hogwarts; + +/** + * + * AppConcesionario: Clase que realiza el tratamiento de los coches de un + * concesionario. + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 4 dic 2025 + * + * + */ + +public class AppHogwarts { + + + public static void main(String[] args) { + AppHogwarts app = new AppHogwarts(); + + } + +} diff --git a/src/main/java/org/lapaloma/hogwarts/service/AlumnoService.java b/src/main/java/org/lapaloma/hogwarts/service/AlumnoService.java new file mode 100644 index 0000000..200e88e --- /dev/null +++ b/src/main/java/org/lapaloma/hogwarts/service/AlumnoService.java @@ -0,0 +1,71 @@ +/** + * + */ +package org.lapaloma.hogwarts.service; + +import java.time.LocalDate; +import java.time.Period; + +import org.lapaloma.hogwarts.vo.Alumno; + +/** + * Isidoro Nevares Martín - Virgen de la Paloma Fecha creación: 9 mar 2026 + */ +public class AlumnoService { + public boolean esMayorDeEdad(Alumno alumno) { + boolean esMayor = false; + LocalDate hoy = LocalDate.now(); + int edad = Period.between(alumno.getFechaNacimiento(), hoy).getYears(); + + if (edad > 18) { + esMayor = true; + } + return esMayor; + } + + public boolean telefonoValido(Alumno alumno) { + boolean esValido = false; + String telefono = alumno.getTelefono(); + + if (telefono != null && telefono.length() >= 9) { + esValido = true; + } + + return esValido; + } + + public String nombreCompleto(Alumno alumno) { + String nombreCompleto = alumno.getApellido1() + " " + alumno.getNombre() + " " + alumno.getApellido2(); + + return nombreCompleto; + } + + public boolean esRepetidor(Alumno alumno) { + boolean esRepetidor = false; + + if (alumno.getEsRepetidor() == "sí") { + esRepetidor = true; + } + return esRepetidor; + + } + + public boolean alumnoTieneCasa(Alumno alumno) { + boolean tieneCasa = false; + if (alumno.getCasa() != null) { + tieneCasa = true; + } + + return tieneCasa; + } + + public String obtenerNombreCasa(Alumno alumno) { + String nombreCasa = "Sin casa"; + + if (!alumno.getCasa().getNombre().isEmpty()) { + nombreCasa = alumno.getCasa().getNombre(); + } + + return nombreCasa; + } +} diff --git a/src/main/java/org/lapaloma/hogwarts/service/CasaService.java b/src/main/java/org/lapaloma/hogwarts/service/CasaService.java new file mode 100644 index 0000000..340c249 --- /dev/null +++ b/src/main/java/org/lapaloma/hogwarts/service/CasaService.java @@ -0,0 +1,36 @@ +/** + * + */ +package org.lapaloma.hogwarts.service; + +import org.lapaloma.hogwarts.vo.Casa; + +/** + * Isidoro Nevares Martín - Virgen de la Paloma Fecha creación: 9 mar 2026 + */ +public class CasaService { + public boolean tieneNombre(Casa casa) { + boolean tieneNombre = false; + if (casa != null) { + String nombre = casa.getNombre(); + tieneNombre = nombre != null && !nombre.trim().isEmpty(); + } + return tieneNombre; + } + + public String obtenerNnombreEnMayusculas(Casa casa) { + String nombreEnMayusculas = null; + if (tieneNombre(casa)) { + nombreEnMayusculas = casa.getNombre().toUpperCase(); + } + return nombreEnMayusculas; + } + + public boolean esCasaValida(Casa casa) { + boolean esValida = false; + if (casa != null && casa.getIdentificador() > 0 && tieneNombre(casa)) { + esValida = true; + } + return esValida; + } +} diff --git a/src/main/java/org/lapaloma/hogwarts/vo/Alumno.java b/src/main/java/org/lapaloma/hogwarts/vo/Alumno.java new file mode 100644 index 0000000..05e035f --- /dev/null +++ b/src/main/java/org/lapaloma/hogwarts/vo/Alumno.java @@ -0,0 +1,110 @@ +package org.lapaloma.hogwarts.vo; + +import java.time.LocalDate; + +/** + * + * Alumno: Clase de persistencia que representa un Alumno de una casa. + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 03 marzo 2026 + * + * + */ +public class Alumno { + private int identificador; + String nombre; + private String apellido1; + private String apellido2; + private LocalDate fechaNacimiento; + private String esRepetidor; + private String telefono; + private Casa casa; + + + + public Alumno(int identificador, String nombre, String apellido1, String apellido2, LocalDate fechaNacimiento, + String esRepetidor, String telefono, Casa casa) { + super(); + this.identificador = identificador; + this.nombre = nombre; + this.apellido1 = apellido1; + this.apellido2 = apellido2; + this.fechaNacimiento = fechaNacimiento; + this.esRepetidor = esRepetidor; + this.telefono = telefono; + this.casa = casa; + } + + 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; + } + + public String getApellido1() { + return apellido1; + } + + public void setApellido1(String apellido1) { + this.apellido1 = apellido1; + } + + public String getApellido2() { + return apellido2; + } + + public void setApellido2(String apellido2) { + this.apellido2 = apellido2; + } + + public LocalDate getFechaNacimiento() { + return fechaNacimiento; + } + + public void setFechaNacimiento(LocalDate fechaNacimiento) { + this.fechaNacimiento = fechaNacimiento; + } + + public String getEsRepetidor() { + return esRepetidor; + } + + public void setEsRepetidor(String esRepetidor) { + this.esRepetidor = esRepetidor; + } + + public String getTelefono() { + return telefono; + } + + public void setTelefono(String telefono) { + this.telefono = telefono; + } + + public Casa getCasa() { + return casa; + } + + public void setCasa(Casa casa) { + this.casa = casa; + } + + @Override + public String toString() { + return "Alumno [identificador=" + identificador + ", nombre=" + nombre + ", apellido1=" + apellido1 + + ", apellido2=" + apellido2 + ", fechaNacimiento=" + fechaNacimiento + ", esRepetidor=" + esRepetidor + + ", telefono=" + telefono + ", casa=" + casa + "]"; + } + +} diff --git a/src/main/java/org/lapaloma/hogwarts/vo/Casa.java b/src/main/java/org/lapaloma/hogwarts/vo/Casa.java new file mode 100644 index 0000000..dd8eeb0 --- /dev/null +++ b/src/main/java/org/lapaloma/hogwarts/vo/Casa.java @@ -0,0 +1,43 @@ +package org.lapaloma.hogwarts.vo; + +/** + * + * Casa: Clase de persistencia que representa una Casa de Hogwarts. + * + * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @date 03 marzo 2026 + * + * + */ +public class Casa { + private int identificador; + String nombre; + + public Casa(int identificador, String nombre) { + super(); + this.identificador = identificador; + this.nombre = nombre; + } + + 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 + "]"; + } + +}