Testes e Integração
Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy — lição 83 de 87.
Desafio
FácilParabéns por construir seu Sistema de Gerenciamento de Biblioteca! É hora de reunir tudo e verificar se todos os componentes funcionam corretamente como um sistema integrado. Você criará um cenário de teste abrangente que exercita todos os recursos que você construiu ao longo deste projeto.
Você trabalhará com todos os sete arquivos do seu sistema concluído:
Book.java: Sua classe Book com isbn, title, author, isAvailable, borrowedBy e todos os métodos associados, incluindogetDetails().User.java: Sua classe User com id, name, lista borrowedBooks e métodos para emprestar/devolver livros.LibraryException.java: Sua classe de exceção personalizada base.BookNotAvailableException.java: Sua exceção para livros indisponíveis.LibraryAdmin.java: Sua interface admin e implementação AdminService.Library.java: Sua classe Library completa com todos os métodos—adicionar/remover livros, registrar usuários, emprestar/devolver, pesquisar e tratamento de exceções.Main.java: Seu teste de integração que demonstrará todo o sistema funcionando em conjunto.
Em sua classe Main, você processará uma série de comandos que testam cada recurso principal do seu sistema de biblioteca. Os comandos vêm como uma única string separada por vírgulas com estes formatos:
ADD_BOOK:isbn:title:author- Adicionar um livro via AdminServiceREGISTER_USER:id:name- Registrar um usuário via AdminServiceBORROW:userId:isbn- Emprestar um livro (com tratamento de exceções)RETURN:userId:isbn- Devolver um livroSEARCH_TITLE:keyword- Pesquisar livros por títuloSEARCH_AUTHOR:keyword- Pesquisar livros por autorREMOVE_BOOK:isbn- Remover um livro via AdminService
Processe cada comando e imprima a saída apropriada:
- ADD_BOOK:
Added: [title] - REGISTER_USER:
Registered: [name] - BORROW: Imprima a mensagem de sucesso ou
Error: [exception message] - RETURN:
[userName] returned [bookTitle] - SEARCH_TITLE: Imprima
Search '[keyword]':seguido pelos detalhes de cada livro correspondente, ouNo results - SEARCH_AUTHOR: Mesmo formato da pesquisa por título
- REMOVE_BOOK:
Removed: [isbn]ouCannot remove: [isbn]
Após todos os comandos, imprima um resumo final:
--- Final Status ---Books: [count]Users: [count]- Para cada usuário, imprima
[name]: [borrowedCount] book(s)
Você receberá uma entrada: a string de comando separada por vírgulas.
Por exemplo, com a 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, sua saída seria:
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 desafio final valida que todos os seus componentes—classes, interfaces, exceções e a lógica da biblioteca—funcionam juntos perfeitamente. Você construiu um Sistema de Gerenciamento de Biblioteca completo e robusto!
Experimente você mesmo
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Ler os comandos separados por vírgula
String input = scanner.nextLine();
String[] commands = input.split(",");
// Criar Library e AdminService
Library library = new Library();
AdminService adminService = new AdminService(library);
// Processar 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: Adicionar tratamento para o comando RETURN
// TODO: Adicionar tratamento para o comando SEARCH_TITLE
// TODO: Adicionar tratamento para o comando SEARCH_AUTHOR
}
// TODO: Imprimir o status final
// --- Status Final ---
// Livros: [count]
// Usuários: [count]
// Para cada usuário: [name]: [borrowedCount] livro(s)
System.out.println("Operations completed");
}
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosCampos (Atributos)Método ConstrutorSobrecarga de ConstrutorRecapitulação - Calculadora Simples4Herança
Herança Básica (extends)A Palavra-chave superSobrescrita de Método (@Override)Encadeamento de ConstrutoresA Classe ObjectHerança Simples e MultinívelPor que não há Herança Múltipla de ClassesRecapitulação - Hierarquia de Funcionários7Métodos Especiais e a Classe Object
Método toString()equals() e hashCode()Método clone()compareTo() e ComparableInterface ComparatorRecapitulação - Ordenação Personalizada10Tratamento de Exceções em POO
Hierarquia de Classes de ExceçãoExceções PersonalizadasErros Checked vs UncheckedPadrão Try With ResourcesRecapitulação - Usuário Validado13Projeto: Gerenciamento de Biblioteca
Visão Geral do Projeto e Modelagem UMLClasses Livro e Usuário2Modificadores de Acesso e Encapsulamento
Visão Geral dos Níveis de AcessoMétodos Getter e SetterOcultação de InformaçõesA Palavra-chave finalRecapitulação - Gerenciador de Conta Bancária5Polimorfismo
Fundamentos de Sobrecarga de MétodosSobrescrita de Métodos (Tempo de Execução)Upcasting e DowncastingO Operador instanceofClasses e Métodos AbstratosRecapitulação - Calculadora de Formas8Conceitos Avançados de OOP
Composição vs HerançaAgregação vs ComposiçãoClasses Internas, Aninhadas e AnônimasEnums e Métodos de EnumRecords (Java 16+)Classes Seladas (Java 17+)11Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão BuilderPadrão ObserverPadrão Strategy3Propriedades de Classe e Membros Estáticos
Variáveis de Instância vs EstáticasMétodos EstáticosBlocos EstáticosConstantes (static final)Recapitulação - Contador e Utilitário6Interfaces e Classes Abstratas
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesDefault e Static em InterfacesClasses Abstratas vs InterfacesInterfaces FuncionaisRecapitulação - Sistema de Pagamento9Generics
Introdução a GenericsClasses GenéricasMétodos GenéricosParâmetros de Tipos DelimitadosWildcards (?, extends, super)Recapitulação - Container Genérico12Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Iterator