Estudo de Caso BankNext: Automação com JUnit e Mockito

BankNext possui um ambiente de produção massivo com mais de 300 microservices em funcionamento. A colaboração de várias equipes trabalhando simultaneamente nesses SVCs aumenta o risco de quebrar funcionalidades. Adicionar JUnits e cobertura de código manualmente a código existente e novo é cansativo e extremamente lento.

Desafios com JUnits Manuais

  1. Atividade demorada para escrever JUnits úteis e corretos manualmente.
  2. Falta de padronização, pois cada um adota abordagens diferentes.
  3. JUnits deficientes/incorretos são criados devido à falta de tempo.
  4. Sincronização manual de JUnits existentes devido a mudanças no código é impraticável.
  5. Escrever JUnits manualmente para código legado é um pesadelo.
  6. O menor prioridade é dada a JUnits devido a prazos; portanto, são ignorados.
  7. A qualidade do código sofre imensamente, e a dívida técnica se acumula.

Solução: Automação com JUnit-Mockito

  1. GitHub 
  2. A automação recebe o nome da classe e cria JUnits funcionais e legais.
  3. Esses JUnits gerados contêm os mocks Mockito necessários.
  4. Lida com JUnits para RestControllers, Services, Handlers, classes Kafka, etc.
  5. Assim, alcança mais de 70% de cobertura de código em quase todas as situações.

Capacidades de Automação

  1. Funciona tanto para aplicações baseadas em Maven do SpringBoot 2.x quanto 3.x.
  2. Quase nenhum esforço de configuração.
  3. Leva o caminho local do seu aplicativo & entradas de usuário muito básicas.
  4. Utiliza utilitários de Reflection para deduzir detalhes da estrutura do aplicativo.
  5. Identifica de forma transparente os beans simulados necessários.
  6. Gera automaticamente mocks “When-Then” do Mockito.
  7. Gera relatórios de cobertura de código Jacoco.

Estrutura de um JUnit Legal

  1. Porções obrigatórias: 3
    1. Invocar o método de teste alvo
    2. Simular quaisquer interações que sejam externas a esta classe
    3. Verificar se a saída real corresponde à esperada assert/verify
  2. Identificar e declarar todas as classes externas como MockBeans
  3. Interações de Stub das respostas esperadas a partir destes MockBean
  4. Abaixo estão as regras de base para um JUnit legal e funcional básico
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

Demo de Automação

Visualize a demo aqui.

Shell

 

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

# Estrutura final do meu diretório
# C:\Vijay\Java\AutomationJunitMockito\appsetup
# C:\Vijay\Java\projects\junit-mockito-mgt\test-projects\junit-automation 

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

------- Passos da Demo ------
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 e Depois da Execução da Automatização

Conclusão

  1. O BankNext economiza muito tempo e esforço com a criação automática de JUnit.
  2. Isso se traduz diretamente em economias de custos do projeto.
  3. A cobertura de código aumenta imensamente.
  4. A equipe consegue se concentrar completamente em atividades de desenvolvimento reais.
  5. JUnits adicionados/mantidos de forma consistente com quase nenhum esforço manual.
  6. A dívida técnica é reduzida drasticamente.
  7. Aumenta muito a confiança nas aplicações implantadas na produção.

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