Wednesday, October 03, 2012

Monday, October 01, 2012

JUnit con DataClassG

JUnit con DataClassG
0. ESQUEMA




Services:

Por cada beans crearemos una clase Services que se encargará de interactuar con el controller para realizar las operaciones de la base de datos.
Se crearan los métodos insert, update,delete y los demas metodos para realizar las diversas operaciones.

Test:
Se crearán las clases para test de las clases Services.

Form:
Los formularios para la interactuar con el usuario.
ProvinciasServices.java colocamos los métodos, insert, update,delete

public class ProvinciasServices {
   ProvinciasController provinciasController = new ProvinciasController();

   public ProvinciasServices() {
   }
   public Boolean insert(Provincias provincias){
       try{
           if(provinciasController.insert(provincias)){
             return true;
           }else{
               Mensajeria.MensajeWarning(provinciasController.getMensaje(), "insert()");
           }
        } catch (Exception ex) {
           Mensajeria.MensajeError(ex,"insert()");
       }
       return false;
   }
   
   public Boolean update(Provincias provincias){
       try{
           if(provinciasController.update(provincias)){
             return true;
           }else{
               Mensajeria.MensajeWarning(provinciasController.getMensaje(), "update()");
           }
        } catch (Exception ex) {
           Mensajeria.MensajeError(ex,"update()");
       }
       return false;
   }
   


   public Boolean delete(Provincias provincias){
       try{
           if(provinciasController.delete(provincias)){
             return true;
           }else{
               Mensajeria.MensajeWarning(provinciasController.getMensaje(), "delete()");
           }
        } catch (Exception ex) {
           Mensajeria.MensajeError(ex,"delete()");
       }
       return false;
   }
}

Ahora creamos el test a partir de la clase existente.
Antes de crear la clase en el paquete pruebas seleccionar JUnit Test, y en categorías Test for 
Existing Class



Seleccionamos la clase
Clase de test generada

Se generan los métodos con la palabra test al inicio

public class ProvinciasServicesTest extends TestCase {
      public ProvinciasServicesTest(String testName) {
       super(testName);
   }
   
   @Override
   protected void setUp() throws Exception {
       super.setUp();
   }
   
   @Override
   protected void tearDown() throws Exception {
       super.tearDown();
   }
   /**
    * Test of insert method, of class ProvinciasServices.
    */
   public void testInsert() {
       System.out.println("insert");
       Provincias provincias = null;
       ProvinciasServices instance = new ProvinciasServices();
       Boolean expResult = null;
       Boolean result = instance.insert(provincias);
       assertEquals(expResult, result);
       // TODO review the generated test code and remove the default call to fail.
       fail("The test case is a prototype.");
   }

   /**
    * Test of update method, of class ProvinciasServices.
    */
   public void testUpdate() {
       System.out.println("update");
       Provincias provincias = null;
       ProvinciasServices instance = new ProvinciasServices();
       Boolean expResult = null;
       Boolean result = instance.update(provincias);
       assertEquals(expResult, result);
       // TODO review the generated test code and remove the default call to fail.
       fail("The test case is a prototype.");
   }
   /**
    * Test of delete method, of class ProvinciasServices.
    */
   public void testDelete() {
       System.out.println("delete");
       Provincias provincias = null;
       ProvinciasServices instance = new ProvinciasServices();
       Boolean expResult = null;
       Boolean result = instance.delete(provincias);
       assertEquals(expResult, result);
       // TODO review the generated test code and remove the default call to fail.
       fail("The test case is a prototype.");
   }
}

Agregar debajo de la definición de la clase
   DataGManager dataGManager = new DataGManager();
       Connection OpenConnection = dataGManager.OpenConnection();
Esto es para utilizar DataGManager




Ahora comentados todos las instrucciones fail de todos los métodos
comentados

En el  método testInsert()
En la línea   Boolean expResult = null; indica el valor de retorno del método
esperamos que el método insert() devuelva true.asíi que colocamos el valor que esperamos que retorne el método si la operación fue exitosa
Boolean expResult = true;

public void testInsert() {
       System.out.println("insert");
       Provincias provincias = null;
       ProvinciasServices instance = new ProvinciasServices();
       Boolean expResult = null;
       Boolean result = instance.insert(provincias);
       assertEquals(expResult, result);
       // TODO review the generated test code and remove the default call to fail.
      // fail("The test case is a prototype.");
  }

Localizamos el objeto provincias
Provincias provincias = null;
usamos el operador new al objeto provincias
Provincias provincias = new Provincias();

y le asignamos valores al objeto que será pasado al método insert
provincias.setProvincia("Los Santos");
        provincias.setIdprovincia("7");

Quedaría de la siguiente manera
 public void testInsert() {
       System.out.println("insert");
       Provincias provincias = new Provincias();
        provincias.setProvincia("Los Santos");
        provincias.setIdprovincia("7");
       ProvinciasServices instance = new ProvinciasServices();
       Boolean expResult = true;
       Boolean result = instance.insert(provincias);
       assertEquals(expResult, result);
       // TODO review the generated test code and remove the default call to fail.
      // fail("The test case is a prototype.");
   }

Ajustamos los métodos update y delete.


Clase terminada

public class ProvinciasServicesTest extends TestCase {
   
   public ProvinciasServicesTest(String testName) {
       super(testName);
   }
   
   @Override
   protected void setUp() throws Exception {
       super.setUp();
   }
   
   @Override
   protected void tearDown() throws Exception {
       super.tearDown();
   }

   /**
    * Test of insert method, of class ProvinciasServices.
    */
   public void testInsert() {
       System.out.println("insert");
       Provincias provincias = new Provincias();
        provincias.setProvincia("Los Santos");
        provincias.setIdprovincia("7");
       ProvinciasServices instance = new ProvinciasServices();
       Boolean expResult = true;
       Boolean result = instance.insert(provincias);
       assertEquals(expResult, result);
       // TODO review the generated test code and remove the default call to fail.
      // fail("The test case is a prototype.");
   }

   /**
    * Test of update method, of class ProvinciasServices.
    */
   public void testUpdate() {
       System.out.println("update");
       Provincias provincias = new Provincias();
      provincias.setProvincia("Los Santos.");
        provincias.setIdprovincia("7");
       ProvinciasServices instance = new ProvinciasServices();
       Boolean expResult =true;
       Boolean result = instance.update(provincias);
       assertEquals(expResult, result);
       // TODO review the generated test code and remove the default call to fail.
      // fail("The test case is a prototype.");
   }

   /**
    * Test of delete method, of class ProvinciasServices.
    */
   public void testDelete() {
       System.out.println("delete");
       Provincias provincias = new Provincias();
        provincias.setIdprovincia("7");
       ProvinciasServices instance = new ProvinciasServices();
       Boolean expResult = true;
       Boolean result = instance.delete(provincias);
       assertEquals(expResult, result);
       // TODO review the generated test code and remove the default call to fail.
     //  fail("The test case is a prototype.");
   }
}


Ejecutamos el test




Podemos ver el resultado del test


No pasó el testInsert(), Indica que no se insertó, ya que había un registro con ese idprovincia en la tabla,testDelete no lo paso ya que el registro estaba relacionado u otra situación indicandonos que debemos revisar esos métodos.


Otra prueba del test, funciono el metodo testInsert, indicando que se inserto el registro, pero no lo puedo eliminar ni actualizar.

Si se ejecutan las pruebas nuevamente

si el test falla se enviaran mensajes de dialogo como este, esto puede ser un inconveniente si deseamos usar un sistema de integración continua.  Más adelante mostraremos la otra forma de hacerlo.


La ventaja de usar el Warning en el controller es que el invocar el services no tendríamos que generar estas advertencias en el método que realiza el llamado.
En la clase donde se invoca sólo usaríamos el siguiente código.