Estudio de Caso BankNext: Automatización con JUnit y Mockito

BankNext tiene un entorno de producción masivo con más de 300 microservicios en vivo. Múltiples escuadras trabajando concurrentemente en estos SVCs aumenta el riesgo de romper la funcionalidad. Agregar JUnits y cobertura de código manualmente a código existente y nuevo es arduo y sumamente lento.

Desafíos con JUnits Manuales

  1. Actividad intensiva en tiempo para escribir JUnits útiles y adecuados manualmente.
  2. Carece de estandarización porque cada uno toma enfoques diferentes.
  3. Se crean JUnits deficientes/incorrectos debido a falta de tiempo.
  4. Sincronización manual de JUnits existentes debido a cambios en el código es impracticable.
  5. Escribir JUnits manualmente para código legado es una pesadilla.
  6. Se asigna la menor prioridad a los JUnits debido a los plazos; por lo tanto, se saltan.
  7. La calidad del código sufre enormemente, y la deuda técnica se acumula.

Solución: Automatización de JUnit-Mockito

  1. GitHub 
  2. La automatización toma el nombre de la clase y crea JUnits funcionales y legales.
  3. Estos JUnits generados contienen los mocks Mockito necesarios.
  4. Maneja JUnits para RestControllers, Services, Handlers, clases Kafka, etc.
  5. Por lo tanto, logra una cobertura de código superior al 70% en casi todas las situaciones.

Capacidades de Automatización

  1. Funciona tanto para aplicaciones basadas en Maven de SpringBoot 2.x como 3.x.
  2. Casi ningún esfuerzo de configuración.
  3. Toma la ruta local de tu aplicación & entradas de usuario muy básicas.
  4. Utiliza utilidades de reflexión para deducir detalles de la estructura de la aplicación.
  5. Identifica sin problemas los Mockbeans requeridos.
  6. Genera automáticamente mocks “When-Then” de Mockito.
  7. Genera informes de cobertura de código de Jacoco.

Estructura de un JUnit legal

  1. Porciones obligatorias: 3
    1. Invocar el método de prueba objetivo
    2. Simular cualquier interacción que sea externa a esta clase
    3. Comprobar que la salida real coincide con la aserción/verificación esperada
  2. Identificar y declarar todas las clases externas como MockBeans
  3. Interpolar las respuestas esperadas de estas interacciones de MockBean
  4. A continuación se presentan las reglas básicas para un JUnit legal y funcional
Shell

 

Junit-Mockito  Ground Rules

1- target mtd to be tested createCustomer is a void returnType   
2- external mtd invoked .delete     is a void returnType
3- when-then   :  doNothing whenInvoke .delete
4- assertion    :  verify .delete called 1 times  

1- target mtd to be tested createCustomer is a void returnType   
2- external mtd invoked .save          is a Customer returnType
3- when-then   :  when  save then return new Customer
4- assertion    :  verify .save called 1 times

1- target mtd to be tested createCustomer is a Customer returnType   
2- external mtd invoked .save          is a Customer returnType
3- when-then   :  when  save then return new Customer
4- assertion    :  assert result instanceof Customer / Customer is not null

1- target mtd to be tested createCustomer is a Customer returnType   
2- external mtd invoked .findAll          is a List returnType
3- when-then   :  when findAll then return new ArrayList
4- assertion    :  assert result instanceof List / List.size >0

Demostración de Automatización

Ver la demostración aquí.

Shell

 

cd C:\Vijay\Java              [your local machine path]
git clone https://github.com/vijayredkar/junit-mockito-automation.git

# Estructura final de mi directorio
# C:\Vijay\Java\AutomationJunitMockito\appsetup
# C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\junit-automation 

cd C:\Vijay\Java\AutomationJunitMockito\appsetup
setup.bat

------- Pasos de la demostración ------
https://vijayredkar.medium.com/banknext-case-study-junit-mockito-automation-ac9f6b72cfcc
https://github.com/vijayredkar/junit-mockito-automation

C:\Vijay\Java\AutomationJunitMockito\appsetup

demo scenario -1
com.banknext.customer.mgt.service.CustomerServiceImplType1   
com.banknext.customer.mgt.controller.CustomerMgtControllerType1 

demo scenario -2
com.banknext.customer.mgt.service.CustomerServiceImplType2   
com.banknext.customer.mgt.controller.CustomerMgtControllerType2                 

demo scenario -3
com.banknext.customer.mgt.event.publisher.CustomerTxnPublisherType1             
com.banknext.customer.mgt.event.consumer.CustomerTxnConsumerType1               

demo scenario -4
https://github.com/bezkoder/spring-boot-h2-database-crud/tree/master
cd C:\Vijay\Java\projects\junit-mockito-mgt\test-projects
#git clone https://github.com/bezkoder/spring-boot-h2-database-crud.git
cd C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\spring-boot-h2-database-crud
mvn clean install

cd C:\Vijay\Java\AutomationJunitMockito\appsetup
run setup.bat

cd C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\spring-boot-h2-database-crud
mvn clean install
import in Eclipse
add POM dependencies
check current Jacoco code coverage
 

continue automation run 
check/adjust generated Junits
check current Jacoco code coverage
cd C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\spring-boot-h2-database-crud

check new Jacoco code coverage

run all tests 
cd C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\spring-boot-h2-database-crud
mvn clean install
check again all Jacoco code coverage

C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\spring-boot-h2-database-crud\src\main\java\com\bezkoder\spring\jpa\h2
com.bezkoder.spring.jpa.h2.controller.TutorialController
com.bezkoder.spring.jpa.h2.model.Tutorial
TutorialController

Antes y Después de la Ejecución de Automatización

Conclusión

  1. BankNext ahorra una enorme cantidad de tiempo y esfuerzo con la creación automática de JUnit.
  2. Esto se traduce directamente en ahorros de gastos del proyecto.
  3. La cobertura de código aumenta enormemente.
  4. El equipo puede centrarse completamente en actividades de desarrollo real.
  5. Los JUnit se añaden/mantienen de manera consistente con casi ningún esfuerzo manual.
  6. La deuda técnica se reduce en gran medida.
  7. Aumenta enormemente la confianza en las aplicaciones desplegadas en producción.

Source:
https://dzone.com/articles/banknext-case-study-junit-mockito-automation-1