BankNext Fallstudie: JUnit Mockito Automatisierung

BankNext verfügt über eine große Produktionsumgebung mit über 300 laufenden Microservices. Mehrere Teams, die gleichzeitig an diesen Diensten arbeiten, erhöhen das Risiko, dass Funktionalitäten kaputt gehen. Das manuell Hinzufügen von JUnits und Codeabdeckung zu bestehendem und neuen Code ist mühsam und äußerst langsam.

Herausforderungen bei manuellen JUnits

  1. Zeitaufwändige Aktivität, um manuell brauchbare JUnits zu schreiben.
  2. Fehlt eine Standardisierung, da jeder unterschiedliche Ansätze verfolgt.
  3. Fehlerhafte/inkorrekte JUnits werden aufgrund von Zeitknappheit erstellt.
  4. Die manuelle Synchronisation bestehender JUnits aufgrund sich ändernden Codes ist unpraktisch.
  5. Das manuell Schreiben von JUnits für Legacy-Code ist ein Albtraum.
  6. JUnits erhalten aufgrund von Deadlines die geringste Priorität und werden daher oft übersprungen.
  7. Die Codequalität leidet erheblich, und die technische Schuldenlast nimmt zu.

Lösung: JUnit-Mockito-Automatisierung

  1. GitHub 
  2. Die Automatisierung nimmt den Klassennamen entgegen und erstellt funktionsfähige JUnits.
  3. Diese generierten JUnits enthalten die notwendigen Mockito-Mocks.
  4. Bearbeitet JUnits für RestController, Services, Handler, Kafka-Klassen usw.
  5. Dadurch erreicht es in fast allen Szenarien eine Codeabdeckung von über 70%.

Automatisierungsfähigkeiten

  1. Funktioniert sowohl für SpringBoot 2.x als auch 3.x Maven-basierte Anwendungen.
  2. Fast kein Aufwand für die Einrichtung.
  3. Nimmt den lokalen Pfad Ihrer Anwendung & sehr einfache Benutzeranforderungen.
  4. Verwendet Reflexions-Tools zur Deduktion von Anwendungsstrukturdetails.
  5. Ermittelt nahtlos die benötigten Mockbeans.
  6. Generiert automatisch „When-Then“ Mockito-Mockups.
  7. Erstellt Jacoco-Codeabdeckungsberichte.

Struktur eines rechtskräftigen JUnit

  1. Pflichtteile: 3
    1. Führe die Zieltestmethode aus
    2. Mache Mock-Interaktionen, die außerhalb dieser Klasse liegen
    3. Überprüfe, ob das tatsächliche Ergebnis dem erwarteten Assert/Verify entspricht
  2. Identifiziere und deklariere alle externen Klassen als MockBeans
  3. Stub die erwarteten Antworten aus diesen MockBean-Interaktionen
  4. Folgende Grundregeln gelten für einen grundlegenden funktionierenden JUnit
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

Automatisierungs-Demo

Schauen Sie sich die Demo hier an.

Shell

 

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

# Meine finale Verzeichnisstruktur
# C:\Vijay\Java\AutomationJunitMockito\appsetup
# C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\junit-automation 

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

------- Demo-Schritte ------
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

Vor und nach der Automatisierungslauf

Schlussfolgerung

  1. BankNext spart enorm Zeit und Aufwand mit automatischer JUnit-Erstellung.
  2. Dies übersetzt sich direkt in Einsparungen bei den Projektkosten.
  3. Die Codeabdeckung erhöht sich immens.
  4. Das Team kann sich voll und ganz auf echte Entwicklungsaktivitäten konzentrieren.
  5. JUnits werden konsequent hinzugefügt/gepflegt mit fast keinem manuellen Aufwand.
  6. Das technische Schulden werden stark reduziert.
  7. Stark erhöht das Vertrauen in Anwendungen, die in die Produktion bereitgestellt werden.

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