Pruebas e integración
Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy. Lección 83 de 87.
Desafío
Fácil¡Felicidades por construir tu sistema de gestión de biblioteca! Es hora de reunirlo todo y verificar que todos los componentes funcionen correctamente como un sistema integrado. Crearás un escenario de prueba completo que ejercite todas las funciones que has construido a lo largo de este proyecto.
Trabajarás con los siete archivos de tu sistema terminado:
Book.java: Tu clase Book con isbn, title, author, isAvailable, borrowedBy y todos los métodos asociados, incluidogetDetails().User.java: Tu clase User con id, name, la lista borrowedBooks y métodos para pedir prestados y devolver libros.LibraryException.java: Tu clase base de excepción personalizada.BookNotAvailableException.java: Tu excepción para libros no disponibles.LibraryAdmin.java: Tu interfaz de administración y la implementación AdminService.Library.java: Tu clase Library completa con todos los métodos: añadir y eliminar libros, registrar usuarios, pedir prestados y devolver libros, realizar búsquedas y gestionar excepciones.Main.java: Tu prueba de integración que demostrará el funcionamiento conjunto de todo el sistema.
En tu clase Main, procesarás una serie de comandos que prueban todas las funciones principales de tu sistema de biblioteca. Los comandos se proporcionan como una única cadena de texto separada por comas, con estos formatos:
ADD_BOOK:isbn:title:author- Añadir un libro mediante AdminServiceREGISTER_USER:id:name- Registrar un usuario mediante AdminServiceBORROW:userId:isbn- Pedir prestado un libro (con gestión de excepciones)RETURN:userId:isbn- Devolver un libroSEARCH_TITLE:keyword- Buscar libros por títuloSEARCH_AUTHOR:keyword- Buscar libros por autorREMOVE_BOOK:isbn- Eliminar un libro mediante AdminService
Procesa cada comando e imprime la salida correspondiente:
- ADD_BOOK:
Added: [title] - REGISTER_USER:
Registered: [name] - BORROW: Imprime el mensaje de éxito o
Error: [exception message] - RETURN:
[userName] returned [bookTitle] - SEARCH_TITLE: Imprime
Search '[keyword]':seguido de los detalles de cada libro coincidente, oNo results - SEARCH_AUTHOR: El mismo formato que la búsqueda por título
- REMOVE_BOOK:
Removed: [isbn]oCannot remove: [isbn]
Después de todos los comandos, imprime un resumen final:
--- Final Status ---Books: [count]Users: [count]- Para cada usuario, imprime
[name]: [borrowedCount] book(s)
Recibirás una entrada: la cadena de comandos separada por comas.
Por ejemplo, con la entrada ADD_BOOK:ISBN-001:Clean Code:Robert Martin,ADD_BOOK:ISBN-002:Effective Java:Joshua Bloch,REGISTER_USER:U001:Alice,REGISTER_USER:U002:Bob,BORROW:U001:ISBN-001,BORROW:U002:ISBN-001,SEARCH_TITLE:java,RETURN:U001:ISBN-001,REMOVE_BOOK:ISBN-001, tu salida sería:
Added: Clean Code
Added: Effective Java
Registered: Alice
Registered: Bob
Alice borrowed Clean Code
Error: Book not available: ISBN-001
Search 'java':
[ISBN-002] Effective Java by Joshua Bloch
Alice returned Clean Code
Removed: ISBN-001
--- Final Status ---
Books: 1
Users: 2
Alice: 0 book(s)
Bob: 0 book(s)Este desafío final valida que todos tus componentes, clases, interfaces, excepciones y la lógica de la biblioteca funcionen juntos sin problemas. ¡Has construido un sistema de gestión de biblioteca completo y sólido!
Pruébalo tú mismo
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Lee los comandos separados por comas
String input = scanner.nextLine();
String[] commands = input.split(",");
// Crea Library y AdminService
Library library = new Library();
AdminService adminService = new AdminService(library);
// Procesa cada comando
for (String command : commands) {
String[] parts = command.split(":");
String operation = parts[0];
if (operation.equals("ADD_BOOK")) {
String isbn = parts[1];
String title = parts[2];
String author = parts[3];
if (adminService.addBook(isbn, title, author)) {
System.out.println("Added: " + title);
}
} else if (operation.equals("REMOVE_BOOK")) {
String isbn = parts[1];
if (adminService.removeBook(isbn)) {
System.out.println("Removed: " + isbn);
} else {
System.out.println("Cannot remove: " + isbn);
}
} else if (operation.equals("REGISTER_USER")) {
String id = parts[1];
String name = parts[2];
if (adminService.registerUser(id, name)) {
System.out.println("Registered: " + name);
}
} else if (operation.equals("BORROW")) {
String userId = parts[1];
String isbn = parts[2];
try {
String result = library.borrowBook(userId, isbn);
System.out.println(result);
} catch (LibraryException e) {
System.out.println("Error: " + e.getMessage());
}
}
// TODO: Añade el manejo del comando RETURN
// TODO: Añade el manejo del comando SEARCH_TITLE
// TODO: Añade el manejo del comando SEARCH_AUTHOR
}
// TODO: Imprime el estado final
// --- Final Status ---
// Libros: [count]
// Usuarios: [count]
// Para cada usuario: [name]: [borrowedCount] libro(s)
System.out.println("Operations completed");
}
}
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosIntroducción a la OOPClases vs. ObjetosLa palabra clave thisMétodosCampos (Atributos)Método constructorSobrecarga de constructoresResumen - Calculadora simple4Herencia
Herencia básica (extends)La palabra clave superSobrescritura de métodos (@Override)Encadenamiento de constructoresLa clase ObjectHerencia simple y multinivelPor qué no hay herencia múltiple de clasesResumen - Jerarquía de empleados7Métodos especiales y la clase Object
Método toString()equals() y hashCode()Método clone()compareTo() y ComparableInterfaz ComparatorResumen - Ordenamiento personalizado10Manejo de excepciones en POO
Jerarquía de clases de excepcionesExcepciones personalizadasErrores Checked vs UncheckedPatrón Try With ResourcesResumen - Usuario validado13Proyecto: Gestión de biblioteca
Descripción general del proyecto y diseño UMLClases de Libro y UsuarioSistema de préstamosFuncionalidad de búsquedaInterfaz de administradorIntegración de manejo de excepcionesPruebas e integración2Modificadores de acceso y encapsulamiento
Visión general de los niveles de accesoMétodos Getter y SetterOcultamiento de informaciónLa palabra clave finalResumen - Gestor de cuentas bancarias5Polimorfismo
Fundamentos de sobrecarga de métodosSobrescritura de métodos (tiempo de ejecución)Upcasting y DowncastingEl operador instanceofClases y métodos abstractosResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaAgregación vs. ComposiciónClases internas, anidadas y anónimasEnums y métodos de EnumRecords (Java 16+)Clases selladas (Java 17+)11Patrones de diseño - Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón BuilderPatrón ObserverPatrón Strategy3Propiedades de clase y miembros estáticos
Variables de instancia vs. estáticasMétodos estáticosBloques estáticosConstantes (static final)Repaso - Contador y utilidad6Interfaces y Clases Abstractas
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesMétodos Default y Static en InterfacesClases Abstractas vs InterfacesInterfaces FuncionalesResumen - Sistema de Pagos9Genéricos
Introducción a los genéricosClases genéricasMétodos genéricosParámetros de tipo delimitadosComodines (?, extends, super)Resumen - Contenedor genérico12Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón IteratorPractica por tu cuenta: Compilador de Java online