09 diciembre 2020

Construir una aplicación web con Spring Boot y Vaadin Fusion

Introducción 

En este artículo crearemos una aplicación con el Framework Vaadin Fusion, con el Backend Spring Boot y Base de Datos Mysqlutilizando el Starter Vaadincomo pueden observar en la figura 1, que nos ayudara a la configuración del proyecto a desarrollar de una manera mas facíl.

Figura 1

Antes de comenzar, explicare un poco sobre Vaadin Flow y Vaadin Fusion, para que puedan observar las diferencias, en que proyecto puedan utilizarlo o si necesitas de los dos mundos puedas usar ambas opciones.

Vaadin FlowEs un framework para construir aplicaciones web 100% en Java. Permitiendo a los desarrolladores construir aplicaciones de una sola página completamente en Java. Se puede utilizar HTML, JavaScript y CSS para la personalización, pero no es necesario para construir una aplicación. Cuando se utiliza la API de Java, las aplicaciones Vaadin se ejecutan del lado del servidor dándole acceso a los datos y el servicio proporciona la seguridad y estabilidad, sin necesidad de crear API de REST. 

Vaadin Flow esta: 

  • Basado en componentes
  • Programático
  • Event-Driven.

En un post anterior desarrolle un ejemplo con Vaadin Flow

Vaadin FusionEs un framework para construir aplicaciones web reactivas del lado del cliente. Las vistas se basan en componentes web, construidos con LitElement que es una librería que ayuda a construir componentes web y el modelo de programación que utiliza es el estándar de TypeScript que es muy similar a React. Por otro lado el servidor Vaadin exporta funciones tipado, asíncronas para el acceso al servidor, dándole el mismo tipo de información tanto en el servidor como en el cliente. La información de tipo se genera automáticamente en base a las clases del servidor, lo que significa que notarás cambios en la API en tiempo de compilación, pero no en tiempo de ejecución. Por ultimo Las aplicaciones de Fusion están construidas sobre estándares web, haciéndolas más estables que las alternativas que se encuentran en el mercado.

Para desarrollar una aplicación simple que utilice la API de Fusion TypeScript consiste en tres archivos.

  • Un archivo que contiene la vista.
  • Un archivo de configuración de ruta.
  • Una página de índice.
Vaadin Fusion esta:
  • Basado en componentes
  • Declaración
  • Reactivo.
Flow y Fusion son frameworks complementarios. Se Pueden usar cualquiera de ellos o combinarlos en la misma aplicación. Por ejemplo, hacer vistas internas de administrador con el Flow y una vistas de usuario final que necesitan trabajar offline con Fusion.

Nota: Fusion sólo está disponible desde la versión de Vaadin 15 en adelante.

A continuación las herramientas que vamos a utilizar.

Requisitos:

Descripción
Software
Link de Descarga


Lenguaje de programación


Java SE 11

Entorno Integrado de Desarrollo (IDE)


Intellij o vscode

Framework
Vaadin
  • Versión 18
Base de Datos
MySQL
Entorno Integrado GUI
MySQL Workbench


Creación de la aplicación con Vaadin Fusion


Ingresamos al sitio web de vaadin. Lo primero que hacemos es crear la vista, para este ejemplo adicionamos una vista en blanco como se muestra en la figura 2

Figura 2

Configuramos la vista de la siguiente manera, como se puede ver en la figura 3.
  • Nombre: Estudiante 
  • URL: estudiante
  • Plantilla: Seleccionamos en Blanco 
  • Tipo: Seleccionamos TypeScript + Html 

Figura 3

En este paso se realiza la configuración de la aplicación, como se puede observar en la figura 4.
  • Nombre: VaadinFusion
  • Grupo ID: Por defecto
  • Vaadin: Seleccionamos Vaadin 18
  • UI: Seleccionamos TypeScript + Html 
  • Backend: Seleccionamos la base de datos.
Figura 4
  • Haz clic en Descargar, y obtendrás un archivo .zip que contiene un proyecto Maven.
  • Para este ejemplo vamos a utilizar el IDE vscode, abrimos el proyecto y se visualiza como en la figura 5.
Figura 5

El proyecto contiene dos carpetas muy importantes que son las siguientes:
  • /frontend - Esta carpeta contiene todo el código del Frontend.
  • /src/main/java - Esta carpeta incluye todo el código del Backend, que es una aplicación de Spring Boot.
En el siguiente paso ejecutamos la aplicación con este comando:

mvn

Deberá abrirse la aplicación en el navegador predeterminado, como se puede observar en la figura 6.

Figura 6

Añadir la dependencia de Mysql y Lombok

Añadimos las dependencias de Mysql y Lombok a la sección <dependencias> en el archivo pom.xml.

<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector- 
    java</artifactId>
   <scope>runtime</scope>
</dependency>

<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId> 
   <optional>true</optional>
</dependency>

Debemos validar que el IDE hizo la importación de las dependencias, o volver a ejecutar el comando.

mvn

Crear Backend en Spring Boot para acceder a los datos


Primero, creamos una clase con el nombre Estudiante.java para usarla como modelo de datos en el paquete com.example.application.data.entity.

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Estudiante extends AbstractEntity {

    @NotNull
    @NotEmpty
    private String nombre;
    
    private String apellido;

}

Segundo, creamos una interfaz con el nombre IEstudianteRepositorio.java para dar soporte a las operaciones CRUD, dándole funcionalidades a la clase entidad en el paquete com.example.application.data.repository.

@Repository
public interface IEstudianteRepositorio extends JpaRepository<Estudiante, Integer> {    }

Tercero, creamos una clase con el nombre EstudianteEndpoint.java, adicionando la anotación @Endpoint para hacer que los métodos y tipos de datos estén disponibles en TypeScript para el Frontend.

@Endpoint
public class EstudianteEndpoint {
private IEstudianteRepositorio repo;
public EstudianteEndpoint(IEstudianteRepositorio repo) {
this.repo = repo;
}
public List<Estudiante> getEstudiantes() {
return repo.findAll();
}
public Estudiante saveEstudiante(Estudiante estudiante) {
return repo.save(estudiante);
}
public void deleteEstudiante(Integer idEstudiante) {
repo.deleteById(idEstudiante);
}
}

Vaadin hace que los métodos getEstudiante()deleteEstudiante() y saveEstudiante() estén disponibles como métodos asincrónicos en TypeScript. También generará una interfaz de TypeScript para Estudiante, para que pueda acceder al mismo tipo-información de ambos lado tanto en el servidor y en el cliente.

Cuarto, modificamos el archivo Application.properties, que nos permite configurar la aplicación Spring Boot para este caso configuramos la conexión a la base de datos MySQL con nombre de usuario sa y contraseña sa, por defecto se ejecuta la aplicación en el puerto 8080.

server.port=${PORT:8080}
logging.level.org.atmosphere = warn
spring.mustache.check-template-location = false
#Conexion BD Mysql
spring.datasource.url = jdbc:mysql://localhost:3306/esajug
spring.datasource.username = root
spring.datasource.password = Maria23*
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
spring.jpa.hibernate.ddl-auto=update

Finalizamos la parte del Backend, ahora el paso siguiente es integrarlo con el Frontend. 
 

Integrar el Endpoint con Vaadin Fusion


Abrir en la carpeta el frontend/views/estudiante/estudiante-view.ts y reemplacemos el siguiente código:

import { Binder, field } from "@vaadin/form";
import {
  css,
  customElement,
  html,
  internalProperty,
  LitElement,
} from "lit-element";
import Estudiante from "../../generated/com/example/application/data/entity/Estudiante";
import EstudianteModel from "../../generated/com/example/application/data/entity/EstudianteModel";
import "@vaadin/vaadin-text-field";
import "@vaadin/vaadin-button";
import {
  deleteEstudiante,
  getEstudiantes,
  saveEstudiante,
} from "../../generated/EstudianteEndpoint";

@customElement("estudiante-view")
export class EstudianteView extends LitElement {
  @internalProperty()
  private estudiantes: Estudiante[] = [];

  @internalProperty()
  private message = "";

  private binder = new Binder(this, EstudianteModel);

  static get styles() {
    return css`
      :host {
        display: block;
        padding: var(--lumo-space-l);
      }
    `;
  }

  render() {
    const { model } = this.binder;
    return html`<h1>Estudiante</h1>
      <div class="message">${this.message}</div>
      <ul>
        ${this.estudiantes.map(
      (person) => html`<li>${person.nombre} ${person.apellido}
       <vaadin-button @click=${() => this.clear(person.id)}>
           <iron-icon icon="lumo:minus" slot="prefix"></iron-icon>
                Delete
       </vaadin-button
       </li>`
    )}
      </ul>
      <h2>Nuevo EStudiante</h2>
      <div class="form">
        <vaadin-text-field
          label="Nombre"
          ...=${field(model.nombre)}
        ></vaadin-text-field>
        <vaadin-text-field
          label="Apellidos"
          ...=${field(model.apellido)}
        ></vaadin-text-field>
        <vaadin-button @click=${this.add}>
          <iron-icon icon="lumo:plus" slot="prefix"></iron-icon>Add
        </vaadin-button>
      </div>`;
  }
  async add() {
    const saved = await this.binder.submitTo(saveEstudiante);
    if (saved) {
      this.estudiantes = [...this.estudiantes, saved];
      this.binder.clear();
    }
  }

  async firstUpdated() {
    this.estudiantes = await getEstudiantes();
  }

  async clear(id: any) {
    await deleteEstudiante(id);
    this.estudiantes = this.estudiantes.filter((t) => t.id !== id);
  }
}

Aquí una breve descripción del código y funcionamiento:
  • EstudianteView está mapeado a un elemento HTML personalizado <estudiante-view> con @customElement.
  • @internalProperty()
    private estudiantes: Estudiante[] = [];
    
    @internalProperty()
    private mensaje = '';
    
  • Define dos propiedades internas: estudiante y mensaje para mantener el estado del componente. Cada vez que una propiedad cambie, la plantilla se vuelve a renderizar.

  • private binder = new Binder(this, EstudianteModel);
    
    Crea un binder para el formulario y carga la información del modelo generado. 
    Lleva un registro del valor del modelo, maneja validaciones y envía el valor al endpoint.
  • render() define una plantilla reactiva que se actualiza cada vez que cambia una propiedad.
  • <ul>
        ${this.estudiantes.map(
        (person) => html`<li>${person.nombre} ${person.apellido}
        <vaadin-button @click=${() => this.clear(person.id)}>
          <iron-icon icon="lumo:minus" slot="prefix"></iron-icon>
             Delete
        </vaadin-button
        </li>`
      )}
    </ul>
    

    La plantilla utiliza utiliza <ul> para listar todos los estudiantes, el operador map sobre el array de estudiantes y crea una etiqueta <li> para cada estudiante. Adiciona un botón eliminar a cada elemento que llama al método clear() con el id del estudiante. Por ultimo se comunica con el backend para obtener la lista de todo los estudiantes cuando el componente se actualiza por primera vez.
  • <vaadin-text-field
        label="Nombre"
        ...=${field(model.nombre)}>
    </vaadin-text-field>
    <vaadin-text-field
        label="Apellidos"
        ...=${field(model.apellido)}>
    </vaadin-text-field>
    
    <vaadin-button @click=${this.add}>
       <iron-icon icon="lumo:plus" slot="prefix"></iron-icon>
       Guardar
    </vaadin-button>

  • Muestra un formulario para adiciona un nuevo estudiante. El formulario utiliza dos componentes de Vaadin: vaadin-text-field y vaadin-button. Los campos se enlaza al Binder con la ayuda del operador de extensión (...=${field(...)}) . El botón Guardar invoca el método Add() cuando hace clic sobre él validando el formulario y guarda el nuevo estudiante en el backend.

  • Index.html

         En este archivo de define una salida para las rutas.
  • Index.ts

         En este archivo se mapea la ruta de la raíz del componente
main-view
         Por otro lado también se da la salida a todas las rutas en #outlet.
  • Para concluir, se desarrollo una aplicación con spring boot y vaadin fusion conectada a una base de datos MySQL. La aplicación web se visualizara como en la figura 7.

 



03 octubre 2020

Libro - Building Modern Web Applications With Jakarta EE, NoSQL Databases and Microservices

Estoy presentando este libro, que fu escrito en colaboración de Aristides Villarreal, Otávio Santana y la revisión de un amigo Drabo Constantin

Hacemos un recorrido sobre las especificaciones JakartaEE, NoSQL, JMoordb, Vaadin, Microservicios y Testing.




Se encuentra disponible en Amazon


El libro esta estructurado de la siguiente forma:

  • Jakarta EE Platform: Una introducción a la plataforma de Jakarta EE. Donde conocerás la especificaciones mas populares en el mercado con ejemplos prácticos.
  • NoSQL: En esta sección exploramos los fundamentos de las bases de datos NoSQL y sus ventajas al momento de seleccionarla en un proyecto.
  • Jakarta NoSQL: Acá mencionamos como se integra de manera ágil las aplicaciones Java con bases de datos NoSQL en conjunto con las especificación de Jakarta EE.
  • Understanding JMoordb: Esta sección me gusto mucho como se describe la API de Jmoordb comunicándose con la base de datos MongoDB a NoSQL, es una alternativa al momento de desarrollar una aplicación.
  • Exploring Microprofile: En este capitulo el objetivo fue introducir a lector en la iniciativa Eclipse MicroProfile donde se explica un subconjunto de APIs de Jakarta EE, por lo que podemos construir aplicaciones de microperfiles de la misma manera que construimos las de Jakarta EE.
  • Java Server Faces: Desde esta sección tratamos de mostrarle al lector como desarrollar aplicaciones con Java Server Faces (JSF) integrando con microservicios y conectado a la base de datos MongoDB.
  • Vaadin: Continuando con las alternativas de la parte del Front-end presentamos el framework Vaadin, el cual está diseñado para desarrollar aplicaciones web en Java o JavaScript usando Web componente, permitiéndole construir una poderosa interfaz de usuario con sólo unas pocas líneas de código, se explican los componentes más usados en el mundo real.
  • Integration Vaadin, JMoordb and NoSQL: En esta sección se explica desde cero como desarrollar una aplicación web en Java, diseñando el código de la interfaz de usuario para que se ejecute de forma segura de lado del servidor. Integrando el framework Vaadin con bases de datos no relacional en este caso MongoDB.
  • Eclipse Krazos and Security of Microservices: En este capitulo es una introducción al nuevo framework MVC Eclipse Krazo, se explica de forma sencilla como implementar seguridad en las aplicaciones de Java utilizando JWT. 
  • Testing and Continuous Integration: En esta sección es una introducción al uso de contenedores, testing, integración continua, DevOps. Con el objetivo que el lector tenga un conocimiento básico sobre esta tecnologías y le ayude a investigar, en algunos casos entrevista laborales.

Esto es un resumen de todo el libro, espero que le guste, de antemano me siento muy agradecido con Aristides Villareal y Otávio Santana por la oportunidad que me dieron para colaborarle en este gran proyecto. También a Drabo Constantine por su revisión del libro y sugerencias.

Por otro lado le agradezco a mis amigos Omar Berroterán, Diego Silva, Ricardo Cantillo, Nelson Duarte y Armando Palmera, por todo su apoyo que me brindaron.

02 octubre 2020

Artículos relacionados con Spring Boot y Project Reactor

Muchas personas me han hecho la siguiente pregunta, ¿Porque no he vuelto a escribir más artículos en el blog? 

La respuesta es la siguiente, la verdad es que estado muy ocupado, comencé desde el año pasado a escribir este libro Building Modern Web Applications With Jakarta EE, NoSQL Databases and Microservices, en colaboración de dos personas muy experta en el mundo Java, Aristides Villareal y Otávio Santana, después nos enviaron las observaciones y realizamos las respectivas correcciones. 

Otro motivo es que me dedique 100% al Grupo de Usuario de Java Barranquilla Jugbaq, en compañía de los otros lideres y miembros del equipo, muy comprometido con las charlas, aquí pueden revisar en el canal Barranquilla Jug, tenemos de muchos temas con respecto a la tecnología de Java. 

Por ultimo quise aportar un granito de arena, escribiendo dos(2) artículos en la comunidad de Java Nicaragua sobre los siguientes temas:

Bueno no se preocupen estaré escribiendo nuevos artículos en mi blog. 

04 septiembre 2019

Testing con Spring Boot

Los casos de prueba son importantes para el desarrollo de las aplicaciones, por lo cual, no solo verifican el código si no que verifican si realmente funciona correctamente, asegurando que deban realizar todo lo que esperan que realicen. 


En este artículo, se explicara un ejemplo con dos tipo de casos diferente, donde podrán escribir pruebas, para asegurarnos de que el código no se rompa o falle a medida que la aplicación vaya evolucionando. Se pueden escribir pruebas antes o después de que se haya escrito el código.

Si retrocedemos hace aproximadamente 12 años, encontraríamos un proceso de prueba en su mayoría conducido por muchos ingenieros de prueba. Pero con el aumento de JUnit, la adopción de servidores de integración continua (CI), grande cantidades de librerías de prueba y servicios integrados de cobertura de prueba, Puede ver la adopción generalizada de pruebas automatizadas.

Mencionare la metodología TDD, como puede ayudar en la buenas practicas del desarrollo de software.

Test-Driven Development (TDD)


Consiste en escribir pruebas automatizadas que verifiquen si el código realmente funciona. TDD se centra en el desarrollo con los requisitos bien definidos en forma de pruebas. Cada proceso de desarrollo incluye pruebas de forma automática o manual. Las pruebas automatizadas dan como resultado un ciclo de desarrollo general más rápido. TDD eficiente es más rápido que el desarrollo sin pruebas. La cobertura de prueba integral proporciona confianza en el desarrollo de la aplicación y esta confianza permite la refactorización de la aplicación. La refactorización promueve el desarrollo ágil; Es fácil descubrir fallas y las corrige. Las pruebas te hacen pensar en tu diseño. Si su código es difícil de probar, entonces el diseño debe reconsiderarse. Un caso de prueba te ayuda a concentrarte en lo que importa. Te ayuda a no escribir código que no necesita y encuentra problemas temprano durante el desarrollo.

Ejemplo

Spring Boot agrega automáticamente la dependencia “Test” cuando creamos el proyecto de desde la página Spring Initializr , agregando dicha dependencia al archivo “pom.xml” como se puede observar en la figura 1. 

1
2
3
4
5
<dependency>           
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
   <scope>test</scope>
</dependency>
Figura 1
 
Por otro lado Spring Boot proporciona muchas librerias útiles que nos pueden servir para realizar pruebas, como son JUnit, Mockito, AssertJ y otras más. 

Acá dejo una breve definición de cada librería, con el objetivo que el lector tenga una idea y en el caso que quiera investigar o profundizar más en el tema: 
  • JUnit: Esto está relacionado con las pruebas unitarias de aplicaciones Java
  • JSONassert: Esta librería se utiliza para hacer valer en JSON - support.
  • AssertJ: Es una biblioteca de afirmaciones.
  • Mockito: Es un framework de trabajo para crear Mocks en los tests unitarios escritos en Java.
  • Hamcrest: Esta biblioteca está relacionada con restricciones o predicados
  • Spring Test y Spring Boot Test: Añaden utilidades y soporte de pruebas de integración para aplicaciones con Spring Framework y Spring Boot.
  • JsonPath: XPath para JSON.
Además de que estas diversas bibliotecas de prueba se suministran automáticamente, también se incluyen muchas dependencias opcionales. Esto significa que se pueden agregar a la lista de dependencias de nuestro proyecto sin especificar la versión. Las dependencias opcionales se enumeran a continuación:
  • HTMLUnit: kit de herramientas de prueba para salidas en HTML
  • Selenium: automatización del navegador para pruebas de UI
  • Flapdoodle: base de datos MongoDB integrada para pruebas
  • H2: base de datos SQL integrada para pruebas
  • Spring REST Docs: genera documentación REST utilizando pruebas automatizadas

Si observa la Figura 2, la estructura de proyecto, tiene creado su propio paquete para las clases de prueba:
Figura 2

Creando Pruebas Unitarias


Comenzamos creando nuestro primer caso de prueba, en este caso estamos utilizando un JUnit, que es una libreria popular de pruebas unitarias basada en Java como lo mencione anteriormente. El siguiente código fuente muestra la estructura de ejemplo test en una clase de Spring Boot. 

  • La anotación @SpringBootTest especifica que es una clase de prueba regular que ejecuta pruebas basadas en Spring Boot. 
  • La anotación @Test antes del método define a JUnit que es el método que se puede ejecutar como un caso de prueba. 
  • La anotación @RunWith(SpringRunner.class) proporciona un Spring ApplicationContext y obtiene beans inyectados en su instancia de prueba, como se puede observar la Figura 3.

@SpringBootTest
public class TestCustomerApplicationTests {

        @Test
        public void contextLoads() { 
 
        }
}
Figura 3

Continuamos con nuestro caso de prueba, que en este paso, se probará la funcionalidad principal de la aplicación antes de crear cualquier caso de prueba formal. Abrimos la clase de prueba TestCustomerApplicationTests que fue creada en la aplicación. Hay un método de prueba llamado contextLoads donde vamos agregar la prueba. La siguiente prueba comprueba que la instancia del controlador que se crea e inyecta con éxito, como se puede observar la Figura 4:

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestCustomerApplicationTests {


 @Autowired
 private CustomerController controller;

 @Test
 public void contextLoads() {
  assertThat(controller).isNotNull();
 }

}
Figura 4

Para ejecutar pruebas en el IDE Intellij, nos ubicamos en el explorador de proyectos, presionamos clic derecho en la clase TestCustomerApplicationTest y seleccionamos Run | ‘TestCustomerApplicationTest’ del menú, como se muestra en la Figura 5.

Figura 5

Ahora nos ubicamos en la pestaña JUnit en la parte inferior del IDE, para observar los resultados de la prueba como se muestran en esta pestaña, para este caso, fue exitoso, como se puede observar en la Figura 6. 

Figura 6

Continuamos con el Caso de prueba # 2 

Para realizar este caso # 2, vamos a descargar la versión de inicio del proyecto, con el objetivo que ya se encuentra creadas algunas clases que vamos a utilizar en el ejemplo. Creamos la prueba unitaria para nuestro repositorio de “Customer”, con el objetivo de probar las operaciones CRUD. Creamos una nueva clase llamada CustomerRepositoryTest dentro del paquete de TestCustomer. Utilizamos la anotación @DataJpaTest en vez de la anotación @SpringBootTest, con la finalidad que se puedea usar si la prueba se enfoca solo en componentes JPA. Al usar esta anotación, la base de datos H2, Hibernate y Spring Data se configuran automáticamente para la prueba. El registro de SQL también está activado. Las pruebas son transaccionales por defecto y se retrotraen al final del caso de prueba. TestEntityManager se usa para manejar las entidades persistentes y está diseñado para usarse en pruebas. Puede ver el código fuente de la clase de prueba JPA en la figura 7:

@RunWith(SpringRunner.class)
@DataJpaTest
public class CustomerRepositoryTest {

    @Autowired
    private TestEntityManager entityManager;

    @Autowired
    private CustomerRepository repository;
}
Figura 7


Adicionamos el primer caso de prueba de la operación CRUD, en este caso vamos probar  el guardar "save" de un cliente nuevo a la base de datos. Se crea un nuevo objeto de Cliente y se guarda en la base de datos con el método persistAndFlush, proporcionado por TestEntityManager. Luego, verificamos que la identificación del cliente no puede ser nula  y si se guarda correctamente. El siguiente código fuente como se puede observar en la Figura 8, muestra el método del caso de prueba. Agregue el siguiente código de método a su clase CustomerRepositoryTest:


    @Test
    public void saveCustomer() {
        Customer customer = new Customer("Mark", "Heckler", "Calle 5", "New York", 35);
        entityManager.persistAndFlush(customer);
        assertThat(customer.getId()).isNotNull();
    }

Figura 8


El segundo caso de prueba vamos a probar la eliminación "delete" de clientes de la base de datos. Creamos un nuevo objeto de cliente y se guarda en la base de datos. Luego, todos los clientes se eliminan de la base de datos y finalmente, el método de consulta findAll() debería devolver una lista vacía. El siguiente código fuente como se puede observar en la Figura 9, muestra el método del caso de prueba. Agregue el siguiente código de método a su clase CustomerRepositoryTest:

    @Test
    public void deleteCustomer() {
        entityManager.persistAndFlush(new Customer("Omar", "Berroteran", "Calle 6", "Managua", 40));
        entityManager.persistAndFlush(new Customer("Elena", "Aguirre", "Calle 7", "Barranquilla", 23));

        repository.deleteAll();
        assertThat(repository.findAll()).isEmpty();
    }
Figura 9

Ejecutamos los casos de prueba y verifique la pestaña JUnit, para comprobar que las pruebas fueron exitosas como se puede observar en la figura 10:

Figura 10

Conclusión 

Una buena practica al desarrollar aplicaciones es implementar y usar las pruebas unitarias, las ventajas es que son fácil de implementar, comprender y se pueden reutilizar.


Referencias


  • Libro: Hands-On Full Stack Development with Spring Boot 2.0 and React, Segunda Edicion, By Juha Hinkula. Siquieres adquirirlo visita Aquí
  • Libro: Mastering Spring Boot 2.0, By Dinesh Rajput. Si quieres adquirirlo visita Aquí