Menu
Coddy logo textTech

Testes e Integração

Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy — lição 83 de 87.

challenge icon

Desafio

Fácil

Parabé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, incluindo getDetails().
  • 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 AdminService
  • REGISTER_USER:id:name - Registrar um usuário via AdminService
  • BORROW:userId:isbn - Emprestar um livro (com tratamento de exceções)
  • RETURN:userId:isbn - Devolver um livro
  • SEARCH_TITLE:keyword - Pesquisar livros por título
  • SEARCH_AUTHOR:keyword - Pesquisar livros por autor
  • REMOVE_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, ou No results
  • SEARCH_AUTHOR: Mesmo formato da pesquisa por título
  • REMOVE_BOOK: Removed: [isbn] ou Cannot 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