25
Practica 1 Practica 1 Biblioteca Biblioteca Mockito Mockito UNED 2016 UNED 2016 Equipo Equipo Alberto Gómez Alberto Gómez Ignacio Cerezo Ignacio Cerezo Federico Graziano Federico Graziano Ismael Martín Ismael Martín Carlos Larrondo Carlos Larrondo Carlos Almarcha Carlos Almarcha José Barba José Barba Docente Docente Carlos Luis Sánchez Carlos Luis Sánchez

[UNED2016] Practica 1 - Biblioteca mockito

Embed Size (px)

Citation preview

Page 1: [UNED2016] Practica 1 - Biblioteca mockito

Practica 1Practica 1Biblioteca MockitoBiblioteca Mockito

UNED UNED 20162016

EquipoEquipoAlberto GómezAlberto GómezIgnacio CerezoIgnacio CerezoFederico GrazianoFederico GrazianoIsmael MartínIsmael MartínCarlos LarrondoCarlos LarrondoCarlos AlmarchaCarlos AlmarchaJosé BarbaJosé Barba

DocenteDocenteCarlos Luis SánchezCarlos Luis Sánchez

Page 2: [UNED2016] Practica 1 - Biblioteca mockito

Gestión, requisitos y Gestión, requisitos y objetivosobjetivos

Análisis:Punto de partida: De qué partimos?Especificacion de requisitos: Definición exhaustiva del QUÉ

Metodología de trabajo:Roles: Quién es quién?Herramientas utilizadas:

Redmine -> Coordinación y gestión de tareasSVN -> gestión de código fuente.

Reparto de TareasDetalle tecnico

Requisitos Globales: Afectan a toda la aplicación.Requisitos asociados a Libros Requisitos asociados a SociosRequisitos asociados a Préstamos

Page 3: [UNED2016] Practica 1 - Biblioteca mockito

AnálisisAnálisisDe dónde partimos?

http://62.204.199.127/JAVA_UNED/bea/browser/biblioteca_Mockitorevision 131

RequisitosGlobales:

[GBL-1]Soporte para conexion a Oracle [GBL-2]Creación de menú CRUD en menú popup contextual [GBL-3]Internacionalización de la aplicación [GBL-4]Cierre ordenado de la aplicación [GBL-5]Pruebas unitarias [GBL-6]Creación de un HOW TO JUnit/Mockito [GBL-7]Presentacion SlideShare

Socios[SCS-1]Inclusión de una ficha para la modificación de SOCIOS

Prestamos[PRT-1]Inclusión de una ficha para la inserción de PRESTAMOS [PRT-2]Inclusión de una ficha para la modificación de PRESTAMOS [PRT-3]Socios y libros ORDENADOS en combos

Libros[LBR-1]Inclusión de una ficha para la inserción de PRESTAMOS [LBR-2]Inclusión de una ficha para la modificación de PRESTAMOS

Page 4: [UNED2016] Practica 1 - Biblioteca mockito

Metodología de trabajoMetodología de trabajoRoles

EquipoCarlos Almarcha - en adelante 'calmarcha‘Carlos Larrondo - en adelante 'clarrondo‘Federico Graziano - en adelante 'fgraziano‘Ismael Martín - en adelante 'imartin‘Ignacio Cerezo - en adelante 'icerezo‘

Responsable ProductoCarlos Luis Sánchez

Scrum MasterJosé Barba - en adelante 'jbarba‘

HerramientasRedmain en www.hostedredmine.org para Coordinacion y asignación de tareasSVN para gestion de código fuente.

Page 5: [UNED2016] Practica 1 - Biblioteca mockito

Metodología de trabajoMetodología de trabajo--DetalleDetalleUso Redmine

Cada práctica un proyecto en RedMine.Cada práctica tiene tareas, representadas como 'Issues‘Cada tarea tiene un resposable asignadoLas tareas las asigna el SM.

Distribucion de tiempo efectivo del equipoLunes: Reunion con Responsable productoMartes-Miercoles: Determinación y asignación de tareasMiercoles: Reunion SM<->Equipo para aclarar dudas sobre tareas asignadasJueves-Domingo: Tiempo efectivo de trabajo para el equipo

ReunionesLunes: Resp productoMiercoles: SM y EquipoEn cualquier momento:A demanda del equipo.

Page 6: [UNED2016] Practica 1 - Biblioteca mockito

Metodología de trabajo - Uso Metodología de trabajo - Uso de SVNde SVN

Repositorio SVN sobre ArchLinux versión 1.9.0-1Estructura establecida:

<root>/practica1-BibliotecaGUI |- branches

|- agomez|- calmarcha|- clarrondo|- fgraziano|- icerezo|- imartin|- jbarba

|- dist|- trunk

branches: ramas de desarrollo, una por miembrocada tarea sera una copia del trunk en el branch del responsable

distespacio para entregas a jefe de producto

Trunkcodigo fuente para la práctica

Page 7: [UNED2016] Practica 1 - Biblioteca mockito

Metodología de trabajo - Uso Metodología de trabajo - Uso de SVNde SVN

Ciclo de vida de una tarea sobre repositorioSe crea tarea en RedMine, con responsableSe crea rama desde 'trunk' contra 'branches/<responsable>/<id_tarea>‘La rama creada evoluciona, y la tarea se resuelveSe realiza 'merge' de la rama contra trunk

BeneficiosPremite paralalelizacion de tareasCada tarea tiene su espacio privado de trabajo

PerjuiciosEl SM debe coordinar los cambios y hacer los 'merge's contra el trunkCUIDADO CON PERDER CAMBIOS ENTRE VERSIONES!

Page 8: [UNED2016] Practica 1 - Biblioteca mockito

Acceso a BBDD OracleAcceso a BBDD OracleEspecificación de requisito

Posibilitar la conexión de la aplicación a bases de datos Oracle.Revisión y modificación de clases con acceso a datos.

Estrategia de solución usada Modificación de la lógica de conexión para permitir el uso de BD Oracle. Esto se podrá realizar mediante parametrización.PROBLEMA: El modo de generación de identificadores es diferente en MySql (autogenerado) y Oracle (uso de objetos SECUENCIA). SOLUCION:

Modificación de clases que implementan DAO, mediante extensión de las existentes, permitiendo de esta manera la inserción de registros.Creación de un método estático que obtenga el valor de una secuencia.

Page 9: [UNED2016] Practica 1 - Biblioteca mockito

Modificaciones realizadas Modificaciones realizadas sobre el código existente (I)sobre el código existente (I)

Clase ConnectionManager (MODIFICACIÓN)Selección de método de conexión mediante paramento en fichero de configuración.Ahora se permite MySQL u Oracle (SID o Service Name).

Clase CustomersManagementController (MODIFICACIÓN)

Instanciación de ICustomersDAO dependiendo del tipo de conexión.

Clase BooksManagementController (MODIFICACIÓN)

Instanciación de IBooksDAO dependiendo del tipo de conexión.

Page 10: [UNED2016] Practica 1 - Biblioteca mockito

Modificaciones realizadas Modificaciones realizadas sobre el código existente (II)sobre el código existente (II)

Clase CustomersDAOImplOracle (CREACIÓN)Sobre escritura del método insert para asignar el identificador del socio mediante consulta del valor de una secuencia.

Clase BooksDAOImplOracle (CREACIÓN)Sobre escritura del método insert para asignar el identificador del libro mediante consulta del valor de una secuencia.

Clase UtilsOracle (CREACIÓN)Incluye un método estático que devuelve el valor (NEXTVAL) de una secuencia, a partir del nombre de la misma.

Page 11: [UNED2016] Practica 1 - Biblioteca mockito

Menú CRUD contextualMenú CRUD contextual

Especificación de requisitoInclusión de un menú contextual para la realización de la operaciones CRUD en el componente socios. Éstas serán:

AñadirEditarEliminar

Estrategia de solución usadaReutilización del código del controlador, realizando las llamadas de la misma manera que lo hacen los elementos de la botonera.Creación de los elementos necesarios y asociación con los métodos anteriormente comentados

Page 12: [UNED2016] Practica 1 - Biblioteca mockito

Modificaciones realizadas Modificaciones realizadas sobre el código existentesobre el código existente

Clase CustomerManagementView (MODIFICACIÓN)Creación de elemento JPopMenu.Creación de ítems que conforman el menú.Asociación de listeners a estos ítems.

Clase CustomerManagementController (MODIFICACIÓN)

Modificación de método de gestión de listeners

Page 13: [UNED2016] Practica 1 - Biblioteca mockito

Aspecto del menú contextual Aspecto del menú contextual tras implementación del tras implementación del cambiocambio

Page 14: [UNED2016] Practica 1 - Biblioteca mockito

Requisitos asociados a Requisitos asociados a LibrosLibros

Objetivo Adecuar el proyecto Biblioteca-Mockito al MVC. En la parte de libros se pide asemejar toda la funcionalidad en una sola ficha respetando el modelo MVC.

ResultadoPara cumplir el objetivo, previamente se ha procedido a entender la funcionalidad existente, hemos adquirido el conocimiento de MVC para adecuar la practica a la funcionalidad requerida.Una vez adquirida los conocimientos hemos eliminado el paquete “es.csc.biblioteca.books.gui” la vista y el controlador de la parte Detalle asumiendo dicha funcionalidad en la pantalla principal.

Page 15: [UNED2016] Practica 1 - Biblioteca mockito

Lógica ModificadaLógica ModificadaEliminación de Clases

BookDetailsController.java. BookDetailsView.java.

Modificación de ClasesBooksManagementController. Adquiere la funcionalidad de la clase eliminada BookDetailsController.java

actionPerformedgetBookcheckMandatoryFieldsdoClose

BooksManagementView. Adquieres la funcionalidad/métodos de la clase eliminada BookDetailsView.java

SetOkListener SetBook getBook hideWarninSetCancelListener showWarningTitle showWarningTopicsetEstado

Page 16: [UNED2016] Practica 1 - Biblioteca mockito

Dificultades EncontradasDificultades Encontradas Dificultades a nivel conceptual

Funcionamiento del setLayout Funcionamiento de biblioteca Mockito para pruebas integradas.

Otras dificultadesProblemas al cargar los datos del detalle cuando teníamos seleccionado un libro en el multiregistro.

Page 17: [UNED2016] Practica 1 - Biblioteca mockito

FUNCIONALIDADES FUNCIONALIDADES PRESTAMOS PRESTAMOS BIBLIOTECA MOCKITOBIBLIOTECA MOCKITO

ESQUEMA BASE

REQUISITO. Detalle el requisito (objetivo a cumplir).

DESARROLLO. Breve descripción del desarrollo.

RESOLUCIÓN. Problemas encontrados y su resolución.

Page 18: [UNED2016] Practica 1 - Biblioteca mockito

MODELO MVC PRESTAMOS

REQUISITO: Mantener modelo MVC de desarrollo de la aplicación del que se parte previamente: Biblioteca_mockito. DESARROLLO. La mayor parte del desarrollo previo es válida. La separación impuesta por el patrón MVC está claramente definida. En la parte de Préstamos no estaba desarrollada la ventana externa a eliminar pero si que necesitábamos incorporar código para cubrir funcionalidad.RESOLUCIÓN. Las clases que eran suceptibles de modificar eran las clases del paquete es.csc.biblioteca.loans.gui: LoansManagementView y LoansManagementController y las clases para manejar los modelos CustomersDAOImpl y BooksDAOImpl.Decidimos modificar exclusivamente las clases del paquete es.csc.biblioteca.loans.gui para no interferir en el trabajo de los demás. La consecuencia será que tendremos un par de métodos en la clase controladora "LoansManagementController" que bien podrían estar en las clases de los paquetes de modelo.

Page 19: [UNED2016] Practica 1 - Biblioteca mockito

ACCESO AL MODELO COMPLETO DE ACCESO AL MODELO COMPLETO DE LA APLICACIÓNLA APLICACIÓN

REQUISITO: Necesidad de acceso al modelo completo de la aplicación para poder cumplir con los requisitos funcionales y de desarrollo. DESARROLLO. La funcionalidad de Préstamos, a diferencia de la funcionalidad de Socios o de Libros, necesita el acceso completo al modelo. No solo se necesita acceder al modelo de Préstamos, sino también al modelo de Socios y Libros puesto que se debe mostrar al usuario información sobre estos modelos a través de los componentes JComboBox.

RESOLUCIÓN.Para acceder al modelo de préstamos inicialmente se importaron las clases:

import es.csc.biblioteca.loans.dao.ILoansDAO;import es.csc.biblioteca.loans.dao.LoansDAOException;import es.csc.biblioteca.loans.dao.LoansDAOImpl;Para acceder al resto de modelos se incluyó las siguientes importaciones:import es.csc.biblioteca.customers.dao.*;import es.csc.biblioteca.books.dao.*;import es.csc.biblioteca.loans.dao.LoanDTO;

Page 20: [UNED2016] Practica 1 - Biblioteca mockito

ELIMINACIÓN VENTANA EXTERNA POR FICHA INTERNA

REQUISITO: Eliminar ventana externa de administración de prestamos. Codigo previo del que se parte en Biblioteca_mockito.

DESARROLLO. Incorporación de 8 elementos visuales swing dentro de la ventana de Préstamos objeto de la clase LoansManagemenView. Conformación de la botonera: Añadir, Editar y Eliminar. Aceptar y Cancelar. Nuevas funcionalidades implementada en LoansManagementController.

RESOLUCIÓN. Se mantiene el modelo MVC. Mientras la ventana de Préstamos esté abierta se mantendrá la conexión con los modelos. Esto se realizó dentro de la clase controladora ampliando atributos y modificando su método constructor.

Page 21: [UNED2016] Practica 1 - Biblioteca mockito

CONTROL DE LA FUNCIONALIDAD DESDE CONTROL DE LA FUNCIONALIDAD DESDE LA BOTONERALA BOTONERA

REQUISITO: Solo botón "Eliminar" funciona. Seleccionando sobre la tabla de Préstamos aquellos a ser borrado de base de datos. El resto de botones están velados puesto que no tienen funcionalidad. Habilitar.

DESARROLLO. Del resto de botones daremos funcionalidad a "Añadir" y "Editar". Para ello generaremos sus eventos en la clase "LoansManagementView" y atendiendolos desde la clase "LoansManagementController".

RESOLUCIÓN. Necesitamos dos nuevos botones para un correcto manejo de la funcionalidad: "Aceptar" y "Cancelar".

Para conocer si al Aceptar se debe añadir o corregir la edición de un préstamo, utilizaremos una variable de control "ultimaaccion". Esto se hará en la clase de Control de Préstamos LoansManagementController.

Page 22: [UNED2016] Practica 1 - Biblioteca mockito

CONTROL DE ERRORES DE ESCRITURA CONTROL DE ERRORES DE ESCRITURA EN LOS COMPONENTES DE LA FICHAEN LOS COMPONENTES DE LA FICHA

REQUISITO: La aplicación no debe aceptar que el usuario introduzca valores en blanco. Los errores que pueden producirse a priori son:

El usuario introduce fechas en blanco. El usuario edita sin seleccionar ninguna columna.

DESARROLLO. Para cumplir con este requisito generaremos métodos en la clase vista "LoansManagementView" que comprueben que el valor de los componentes es correcto y que hay alguna fila seleccionada de la tabla.

Estos métodos serán llamados desde la clase "LoansManagementController" para utilizarlos en la lógica de control de la actualización de Préstamos.

RESOLUCIÓN. Error: Ordenación alfabética de los combos. Sol: incorporar el método

estático Collections.sort(). Error: Fechas de la ficha en blanco. Sol: métodos: public boolean

isFechaValida()-->(fecha inicio y fecha fin), public boolean isSelectedRow()-->seleccione un registro de tipo prestamo.

Page 23: [UNED2016] Practica 1 - Biblioteca mockito

POPUP PRESTAMOS BOTON DERECHO POPUP PRESTAMOS BOTON DERECHO DEL MOUSEDEL MOUSE

REQUISITO. Basándonos en el desarrollo previo de esta funcionalidad sobre clientes (Costumers) e indicando el código modificado por nuestro Scrum Máster implementar estas modificaciones adecuándolas a las clases y métodos definidas en Loans.

DESARROLLO. Clases modificadas:

LoansManagementController.java LoansManagementView..java LoansManagementView..form RESOLUCIÓN. La dificultad surgió a la hora de editar el codigo

“protegido” de la clase LoansManagementView.java y más concretamente en el método private void initComponents(). No se encontró la fórmula que dispone Netbeans para poder modificar ese código que genera automáticamente el IDE al diseñar el formulario.

Para poder editarlo se utilizó otro entorno de progración; en nuestro caso DreamWeaver. Se modificó y tras volver abrir el fichero desde Netbeans, se confirma que este código vuelve a ser “protegido” y no permite su edición desde este IDE.

Page 24: [UNED2016] Practica 1 - Biblioteca mockito

GENERACIÓN DE PRUEBAS GENERACIÓN DE PRUEBAS UNITARIAS PRESTAMOSUNITARIAS PRESTAMOS

REQUISITO. Para las pruebas unitarias nos basamos en replicar las clases generadas para las otras funcionalides de Socios y Libros. Se generó una clase para probar métodos de la clase modelo "LoansDAOTest" y otra clase para probar la vista "LoansTableModel".

DESARROLLO. Las pruebas se soportan sobre las librerías JUnit y Mockito. Las pruebas sobre la clase vista "LoansTableModel" se realizan con Mockito para evitar utilizar el repositorio original del desarrollo que es MySQL. Mediante la librería hsqldb se genera una base de datos en memoria simulando el entorno de Producción.

RESOLUCIÓN. La dificultad surgió a la hora adecuar el método testUpdate() de la clase "LoansDAOTest". Estas pruebas unitarias se basan en Junit.

Error en la sentecia: LoanDTO expResult = instance.findByPrimaryKey(idPrestamo);

Detalle error: Detalle:PrestamoDTO{idPrestamo=13, idSocio=CustomerDTO{idSocio=1, dni=null, nombre=Fernandez Najera, apellidos=Luis adfd , direccion=null, fechaAlta=null}, idLibro=LibroDTO{idLibro=1, nombre=Informatica sdaf, autor=null, tema=null}, fechaInicio=2000-01-01, fechaFin=2015-11-21}

Sol: por determinar.

Page 25: [UNED2016] Practica 1 - Biblioteca mockito

ERRORES DETECTADOS SCRUM ERRORES DETECTADOS SCRUM MASTERMASTER

ERROR: Edición de prestamo sin fecha fin. DETALLE DEL ERROR. Consola:

run:Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at

es.csc.biblioteca.loans.gui.LoansManagementView.setEditFicha(LoansManagementView.java:461) At es.csc.biblioteca.loans.gui.LoansManagementController.editLoan(LoansManagementController.java:227) etc...SOLUCIÓN. No se considera q la fecha fin puede ser nula,está en este método:

public void setEditFicha(){ java.sql.Date fecha =

(java.sql.Date)this.tblLoans.getValueAt(this.tblLoans.getSelectedRow(),4); long longfecha = fecha.getTime(); setFechaInicio(new Date(longfecha)); fecha = (java.sql.Date)this.tblLoans.getValueAt(this.tblLoans.getSelectedRow(),5); longfecha = fecha.getTime(); <-- AQUI ESTA EL ERROR SOL: java.sql.Date fechaFin=(fecha == null ? fecha : new java.sql.Date(fecha.getTime()) ); setFechaFin(new Date(longfecha)); }