BankNext Case Study -Junit Mockito Automation

Vijay Redkar
3 min readNov 5, 2023

Automatically produce Junits for your SpringBoot application

Problem Statement-

BankNext’s massive production environment has more than 300 live microservices. Multiple squad’s working concurrently on these svcs heightens the risk of breaking functionality. Adding Junits & code coverage manually to existing and new code is arduous & painfully slow.

Challenges w/ Manual Junits-

1. Time-intensive activity to write proper useful Junits manually.
2. Lacks standardization because each one takes different approaches.
3. Deficient/incorrect Junits are created due to lack of time.
4. Manual sync’up of existing Junits due to changing code is impractical.
5. Writing Junits manually for legacy code is a nightmare.
6. Least priority is allotted to Junits due to deadlines, hence get skipped.
7. Code quality suffers immensely & technical debt piles up.

Solution : Junit-Mockito Automation

1. GitHub : https://github.com/vijayredkar/junit-mockito-automation
2. Automation takes in the Class name & creates a legal working Junits.
3. These generated Junits contains the necessary Mockito mocks.
4. Handles Junits for RestControllers, Services, Handlers, Kafka classes etc.
5. Thus accomplishes > 70% code coverage in almost all scenarios.

Automation Capabilities -

1. Works for both SpringBoot 2.x & 3.x Maven based applications.
2. Almost zero setup effort.
3. Takes the local path of your application & very basic user inputs.
4. Utilizes Reflection utils to deduce application structure details.
5. Seamlessly identifies the required Mockbeans.
6. Automatically generates “When-Then” Mockito mocks.
7. Generates Jacoco code coverage reports.

Structure of a Legal Junit-

  1. Mandatory portions : 3
    - invoke the target test method
    - mock any interaction that are external to this class
    - check the actual output matches the expected assert/verify
  2. Identify & declare all external classes as MockBeans
  3. Stub the expected responses from these MockBean interactions
  4. Below are the ground rules for a basic legal working Junit
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

Automation Demo -

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

# My final directory structure
# 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 Steps ------
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

Before & After Automation Run -

CodeCoverage Results
CodeCoverage Results

Conclusion -

1. BankNext saves enormous time & effort w/ automatic Junit creation.
2. This translates directly in to saving project expenses.
3. Code coverage increases immensely.
4. Team is able to completely focus on real development activities.
5. Junits added/maintained consistently w/ almost zero manual effort.
3. Technical debt reduces vastly.
4. Greatly enhances confidence in applications deployed to production.

--

--

Vijay Redkar

15+ years Java professional with extensive experience in Digital Transformation, Banking, Payments, eCommerce, Application architecture and Platform development