Ir al contenido

Ejercicio

Desarrollar un programa que simule el funcionamiento básico de un cajero automático, enfocado exclusivamente en la validación de retiros de dinero.

El objetivo principal del ejercicio es aplicar el manejo adecuado de errores y excepciones en Java.


  • Todo el código debe estar contenido en una única clase pública denominada Cajero.
  • Todos los métodos deben ser public static.
  • El código debe estar estructurado para facilitar su prueba unitaria.
  • El proyecto debe estar vinculado a un repositorio en GitHub.
  • Se deben seguir las buenas prácticas vistas en clases: nombres descriptivos, separación de lógica por método, y validación explícita de condiciones.

  1. Retirar un monto Método que simula el retiro de dinero desde un cajero automático. Este método debe verificar que:
    • El monto ingresado sea positivo.
    • El monto sea múltiplo de 1000 (para simular billetes).
    • El monto no exceda el saldo disponible.

En caso de violar alguna de estas condiciones, se deberá lanzar una excepción específica utilizando throw.

  1. Consultar Saldo
    Método que permite obtener el saldo actual disponible.

  2. Depositar Dinero
    Método que permite aumentar el saldo, validando que el monto a depositar sea positivo y múltiplo de 1000.

  3. Menú de Interacción
    Se debe incluir una interfaz simple de consola que permita al usuario ejecutar las operaciones anteriores mediante un menú interactivo.


import java.util.Scanner;
public class Cajero {
private static int saldo = 100000;
private static Scanner scanner = new Scanner(System.in);
/**
* Ejecuta el menú principal del programa y gestiona la interacción con el usuario.
*/
public static void menu() {
// TODO: Implementar el código para gestionar la interacción con el usuario.
}
/**
* Muestra el menú principal con las opciones disponibles.
*/
private static void mostrarOpciones() {
// TODO: Implementar el código para mostrar las opciones del menú en pantalla.
}
/**
* Ejecuta la acción correspondiente según la opción seleccionada.
* @param opcion Opción ingresada por el usuario.
*/
private static void ejecutarOpcion(int opcion) {
// TODO: Implementar la lógica para ejecutar la opción seleccionada.
}
/**
* Realiza un retiro de dinero si las condiciones son válidas.
* @param monto Monto a retirar.
*/
public static void retirar(int monto) {
// TODO: Validar monto positivo
// TODO: Validar múltiplo de 1000
// TODO: Validar que el saldo sea suficiente
// TODO: Restar el monto del saldo si todo es válido
}
/**
* Deposita un monto de dinero al saldo, si es válido.
* @param monto Monto a depositar.
*/
public static void depositar(int monto) {
// TODO: Validar monto positivo
// TODO: Validar múltiplo de 1000
// TODO: Sumar el monto al saldo si es válido
}
/**
* Retorna el saldo disponible en la cuenta simulada.
* @return Saldo actual.
*/
public static int obtenerSaldo() {
// TODO: Retornar el valor actual del saldo
return 0;
}
/**
* Reinicia el saldo a un valor inicial fijo (usado en pruebas).
*/
public static void reiniciarSaldo() {
// TODO: Restablecer el valor del saldo a su valor original
}
}

Una vez implementada la lógica de negocio, se deberá generar un archivo de pruebas unitarias utilizando JUnit 5. Estas pruebas deben cubrir casos tanto exitosos como excepcionales.

Prueba ¿Qué verifica? ¿Por qué tiene valor?
testRetiroValido Que se descuente correctamente un monto válido del saldo. Verifica el comportamiento correcto del flujo principal.
testRetiroMontoNegativo Que lanzar una excepción si el monto es negativo. Evita operaciones lógicas incorrectas.
testRetiroExcedeSaldo Que no se permita retirar más de lo disponible. Garantiza la integridad del sistema.
testRetiroNoMultiploDeMil Que se rechace el retiro si no es múltiplo de 1000. Emula la lógica real de dispensación de efectivo.
testRetiroExactoTotalDisponible Que se pueda retirar el saldo completo sin errores. Valida el límite inferior válido del sistema.
testConsultarSaldo Que el saldo se obtenga correctamente. Confirma la precisión del método de consulta.
testDepositoValido Que se pueda aumentar el saldo con un monto válido. Evalúa el flujo de incremento correcto.
testDepositoNegativo Que se rechace un depósito con monto negativo. Previene inconsistencias lógicas.
testDepositoNoMultiplo Que se rechace un depósito si no es múltiplo de 1000. Asegura coherencia con las reglas del sistema.