SlideShare una empresa de Scribd logo
1 de 26
Descargar para leer sin conexión
Mock it with Mockito
Um framework para a construção
de testes unitários melhores
Quem sou eu?
● Renan Uchôa,
○ estudante de Engenharia de Software
pela Universidade Federal do Pampa,
○ e Desenvolvedor Java pela uMov.me
Tecnologia S.A.
Testes unitários
● Testes unitários servem para verificar
comportamentos de unidade em um
sistema.
● Cada teste deve ser independente e
atômico o suficiente para não depender de
outras unidades que não estiverem sendo
testadas
Testes unitários
Sabemos que existe uma diferença entre
testes de caixa-preta e caixa-branca.
Testes unitários
Testes de caixa-preta verificam as saídas de um sistema com base nas
entradas inputadas, sem um prévio conhecimento sobre a estrutura
do programa.
Testes de caixa-branca verificam comportamentos internos da
estrutura do software para serem abordados nos casos de teste.
Testes unitários
E que os testes unitários se encaixam no
conceito de testes de caixa-branca…
… pois permitem ao desenvolvedor construir
testes diretamente baseados no código-fonte e
nos comportamentos apresentados pelas
unidades do software.
Testes unitários
Porém apesar de todos os recursos disponíveis
com o JUnit e na linguagem Java, construir
testes realmente úteis ainda é um desafio.
Testes baseados apenas em
retorno de métodos não são
suficientes para cobrir o código.
Falta interagir com o método de
maneira mais livre.
Como assim?
● E todas as decisões tomadas no código?
● E os comportamentos implícitos no teste?
● E todo o processo realizado até devolver o
resultado do método?
○ Será que nada disso é relevante para o teste?
● E se o retorno do método não me disser
exatamente o que ele fez?
● E como testar um método sem retorno?
Dúvidas, dúvidas, dúvidas...
Mockito: simpler and better mocking
Mockito permite:
● ter maior flexibilidade na hora de testar
cada comportamento;
● isolar a unidade testada do restante do
código;
● manter os testes legíveis e simples
Keep It Simple, Stupid...
Problema
Eu quero testar um comportamento que
inativa um determinado usuário do sistema
após a terceira tentativa de informar a senha.
Porém:
● Não quero que o teste unitário se preocupe
com questões de acesso ao banco de dados;
● Quero verificar apenas se o status foi
alterado e se o método de salvar no banco
de dados foi chamado;
Sugestão
Trabalhar com Mockito pode ajudar a resolver
esse problema.
Primeiramente é preciso baixar a biblioteca do
framework em Java através de um .jar
disponível através do link http://code.google.
com/p/mockito/
E não esqueça de importá-la em seu projeto.
Resolução
Resolução
Passos:
● Importar os métodos estáticos da biblioteca para
dentro da classe de testes;
● "Mockar" a classe UserDao, para simular a interação
com o banco de dados;
● Chamar o método login() que será testado a partir da
classe UserService;
● Usar o verify() do Mockito para verificar se método
login() chama o update() na terceira vez que a senha
estiver incorreta.
Vantagens
Desta maneira eu garanto que o meu código
invocará o acesso ao banco de dados quando
necessário,…
… porém os meus testes não sofrerão com as
instabilidades do banco de dados, pois não
dependem disso para funcionarem.
Assim fica fácil
Com isso manter uma suíte de testes unitários
fica muito mais seguro e tranquilo.
Mockito
O mockito é utilizado para sobrescrever
comportamentos dependentes que fogem ao
escopo do teste implementado.
Não faz sentido permitir que problemas
envolvidos com a classe UserDao afetem os
testes realizados sobre a classe UserService.
Usando o Mockito, todos os métodos da classe
UserDao são sobrescritos e retornam 'null'
Mockito
Com um "mock" em mãos, podemos verificar quantas
vezes um determinado método foi invocado, manipular o
comportamento informando um retorno "fake" para
simular o funcionamento normal da classe, capturar um
determinado objeto enviado por parâmetro, e etc.
Verify
Usando o método verify(), é possível verificar
quantas vezes um determinado método
"mockado" foi chamado durante o teste.
Isso é possível através dos métodos times(),
never(), only(), atLeast(), atMost(), calls(),
atLeastOnce(), com os respectivos
parâmetros.
Ex.: verify(dao, never()).update(any(User.class));
Verify
Veja no exemplo abaixo…
● Construímos uma lista com 5
usuários
● Invocamos um serviço que deve
cadasrtrar todos os usuários
listados
● verificamos se o método save foi
chamado 5 vezes passando
qualquer instância da classe
'User'
when().thenReturn()
O método when() permite simular retornos de
métodos ou lançamentos de exceção.
Dado que eu não quero que um método seja
executado, porém eu dependo de um retorno
para que o método testado continue
funcionando…
Então eu informo qual objeto deve ser
retornado quando o método for invocado.
when().thenReturn()
Dado que o método save() será
invocado pelo service.register()
Quando isso acontecer, ele deve
apenas retornar o mesmo objeto
passado por parâmetro
Sem realizar operações sobre o
banco de dados…
any(),…
Existem vários matcher que podem ser usados
para inferir sobre os parâmetros passados nos
métodos…
any(class), anyLong(), anyString(), indicando
que será esperado qualquer parâmetro de um
determinado tipo…
Também é possível dizer o valor exato que
será esperado através do eq()
e muito mais…
Para os curiosos, existem também alternativas
para capturar argumentos em chamadas de
métodos, usando o ArgumentCaptor…
… fazer verificações em objetos concretos não
mockados, através do spy()…
e utilizar vários matchers úteis como isNull(),
same(), startsWith(), endsWith(), contains(),
isA(class), doNothing(), doThrow(),…
Use mockito nos seus testes,
… e deixe a brincadeira acontecer

Más contenido relacionado

La actualidad más candente

PHPExperience 2016 - Pirâmide de Testes
PHPExperience 2016 - Pirâmide de TestesPHPExperience 2016 - Pirâmide de Testes
PHPExperience 2016 - Pirâmide de TestesDiana Ungaro Arnos
 
Testes: existe vida antes do TDD
Testes: existe vida antes do TDDTestes: existe vida antes do TDD
Testes: existe vida antes do TDDDiana Ungaro Arnos
 
Pensando em java univali turbinando seus testes
Pensando em java univali   turbinando seus testesPensando em java univali   turbinando seus testes
Pensando em java univali turbinando seus testesSandro Giacomozzi
 
Testes O que são e para que servem? - LadyTalks
Testes O que são e para que servem? - LadyTalksTestes O que são e para que servem? - LadyTalks
Testes O que são e para que servem? - LadyTalksDiana Ungaro Arnos
 
PHP Expericence 2015 - Testes Unitários - Existe vida antes do TDD
PHP Expericence 2015 - Testes Unitários - Existe vida antes do TDDPHP Expericence 2015 - Testes Unitários - Existe vida antes do TDD
PHP Expericence 2015 - Testes Unitários - Existe vida antes do TDDDiana Ungaro Arnos
 
Teste Estrutural usando a ferramenta Jabuti
Teste Estrutural usando a ferramenta JabutiTeste Estrutural usando a ferramenta Jabuti
Teste Estrutural usando a ferramenta JabutiInael Rodrigues
 
Testes de Unidade, por que você deve começar a fazer? - Javaneiros
Testes de Unidade, por que você deve começar a fazer? - JavaneirosTestes de Unidade, por que você deve começar a fazer? - Javaneiros
Testes de Unidade, por que você deve começar a fazer? - JavaneirosRenan Siravegna
 
JUnit - Selenium
JUnit - SeleniumJUnit - Selenium
JUnit - SeleniumCaue Guerra
 
Android testing PT-BR
Android testing PT-BRAndroid testing PT-BR
Android testing PT-BRrafaeladson
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junitcejug
 
A importância dos testes unitários: do código legado ao pipeline de testes em...
A importância dos testes unitários: do código legado ao pipeline de testes em...A importância dos testes unitários: do código legado ao pipeline de testes em...
A importância dos testes unitários: do código legado ao pipeline de testes em...Rodrigo Oliveira, Msc, PMP
 
Vamos falar sobre testes no moip
Vamos falar sobre testes no moipVamos falar sobre testes no moip
Vamos falar sobre testes no moipBreno Oliveira
 
MoT-RJ: Identificando mudanças com snapshots teste - Ana Izabel
MoT-RJ: Identificando mudanças com snapshots teste - Ana IzabelMoT-RJ: Identificando mudanças com snapshots teste - Ana Izabel
MoT-RJ: Identificando mudanças com snapshots teste - Ana IzabelLucas Fraga
 
Apresentação lições aprendidas
Apresentação lições aprendidasApresentação lições aprendidas
Apresentação lições aprendidasricardojp
 
Apresentação lições aprendidas
Apresentação lições aprendidasApresentação lições aprendidas
Apresentação lições aprendidasricardojp
 

La actualidad más candente (20)

PHPExperience 2016 - Pirâmide de Testes
PHPExperience 2016 - Pirâmide de TestesPHPExperience 2016 - Pirâmide de Testes
PHPExperience 2016 - Pirâmide de Testes
 
Refatoração de Código Legado
Refatoração de Código LegadoRefatoração de Código Legado
Refatoração de Código Legado
 
Testes: existe vida antes do TDD
Testes: existe vida antes do TDDTestes: existe vida antes do TDD
Testes: existe vida antes do TDD
 
Pensando em java univali turbinando seus testes
Pensando em java univali   turbinando seus testesPensando em java univali   turbinando seus testes
Pensando em java univali turbinando seus testes
 
Testes O que são e para que servem? - LadyTalks
Testes O que são e para que servem? - LadyTalksTestes O que são e para que servem? - LadyTalks
Testes O que são e para que servem? - LadyTalks
 
PHP Expericence 2015 - Testes Unitários - Existe vida antes do TDD
PHP Expericence 2015 - Testes Unitários - Existe vida antes do TDDPHP Expericence 2015 - Testes Unitários - Existe vida antes do TDD
PHP Expericence 2015 - Testes Unitários - Existe vida antes do TDD
 
Teste Estrutural usando a ferramenta Jabuti
Teste Estrutural usando a ferramenta JabutiTeste Estrutural usando a ferramenta Jabuti
Teste Estrutural usando a ferramenta Jabuti
 
Testes de Unidade, por que você deve começar a fazer? - Javaneiros
Testes de Unidade, por que você deve começar a fazer? - JavaneirosTestes de Unidade, por que você deve começar a fazer? - Javaneiros
Testes de Unidade, por que você deve começar a fazer? - Javaneiros
 
Teste baseado em modelos
Teste baseado em modelosTeste baseado em modelos
Teste baseado em modelos
 
JUnit - Selenium
JUnit - SeleniumJUnit - Selenium
JUnit - Selenium
 
Android testing PT-BR
Android testing PT-BRAndroid testing PT-BR
Android testing PT-BR
 
JUnit
JUnitJUnit
JUnit
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junit
 
A importância dos testes unitários: do código legado ao pipeline de testes em...
A importância dos testes unitários: do código legado ao pipeline de testes em...A importância dos testes unitários: do código legado ao pipeline de testes em...
A importância dos testes unitários: do código legado ao pipeline de testes em...
 
Testes de unidade - Conhecendo e aplicando
Testes de unidade - Conhecendo e aplicandoTestes de unidade - Conhecendo e aplicando
Testes de unidade - Conhecendo e aplicando
 
Curso java 07 - exceções
Curso java   07 - exceçõesCurso java   07 - exceções
Curso java 07 - exceções
 
Vamos falar sobre testes no moip
Vamos falar sobre testes no moipVamos falar sobre testes no moip
Vamos falar sobre testes no moip
 
MoT-RJ: Identificando mudanças com snapshots teste - Ana Izabel
MoT-RJ: Identificando mudanças com snapshots teste - Ana IzabelMoT-RJ: Identificando mudanças com snapshots teste - Ana Izabel
MoT-RJ: Identificando mudanças com snapshots teste - Ana Izabel
 
Apresentação lições aprendidas
Apresentação lições aprendidasApresentação lições aprendidas
Apresentação lições aprendidas
 
Apresentação lições aprendidas
Apresentação lições aprendidasApresentação lições aprendidas
Apresentação lições aprendidas
 

Similar a Mock it with mockito

Descomplicando os mocks
Descomplicando os mocksDescomplicando os mocks
Descomplicando os mocksDouglas Bastos
 
Testes de Unidade - Unidade II
Testes de Unidade - Unidade IITestes de Unidade - Unidade II
Testes de Unidade - Unidade IIJoão Lourenço
 
Aexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tddAexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tddCarlos Santana
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade IIIJoão Lourenço
 
Descomplicando os mocks - pyse
Descomplicando os mocks - pyseDescomplicando os mocks - pyse
Descomplicando os mocks - pyseDouglas Bastos
 
1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de softwareHeider Lopes
 
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Claudinei Brito Junior
 
Android: testes automatizados e TDD
Android: testes automatizados e TDDAndroid: testes automatizados e TDD
Android: testes automatizados e TDDDextra
 
Palestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitPalestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitRobinson Castilho
 
Testes de Software
Testes de SoftwareTestes de Software
Testes de SoftwareCapgemini
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 

Similar a Mock it with mockito (20)

Descomplicando os mocks
Descomplicando os mocksDescomplicando os mocks
Descomplicando os mocks
 
Testes de Unidade - Unidade II
Testes de Unidade - Unidade IITestes de Unidade - Unidade II
Testes de Unidade - Unidade II
 
Aexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tddAexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tdd
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade III
 
Descomplicando os mocks - pyse
Descomplicando os mocks - pyseDescomplicando os mocks - pyse
Descomplicando os mocks - pyse
 
Testes Unitários
Testes UnitáriosTestes Unitários
Testes Unitários
 
1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software1 2 3 - Testando - Automatizando os testes de software
1 2 3 - Testando - Automatizando os testes de software
 
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
Minicurso - Técnicas de Teste e Automatização do Teste de Unidade XII SemanaT...
 
TDD com Python
TDD com PythonTDD com Python
TDD com Python
 
Introdução a tdd
Introdução a tddIntrodução a tdd
Introdução a tdd
 
Testes de Sofware
Testes de SofwareTestes de Sofware
Testes de Sofware
 
Android: testes automatizados e TDD
Android: testes automatizados e TDDAndroid: testes automatizados e TDD
Android: testes automatizados e TDD
 
Palestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitPalestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnit
 
Teste de software
Teste de softwareTeste de software
Teste de software
 
Java 12
Java 12Java 12
Java 12
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
 
JUnit
JUnitJUnit
JUnit
 
O que é Teste de Software?
O que é Teste de Software?O que é Teste de Software?
O que é Teste de Software?
 
Testes de Software
Testes de SoftwareTestes de Software
Testes de Software
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 

Mock it with mockito

  • 1. Mock it with Mockito Um framework para a construção de testes unitários melhores
  • 2. Quem sou eu? ● Renan Uchôa, ○ estudante de Engenharia de Software pela Universidade Federal do Pampa, ○ e Desenvolvedor Java pela uMov.me Tecnologia S.A.
  • 3. Testes unitários ● Testes unitários servem para verificar comportamentos de unidade em um sistema. ● Cada teste deve ser independente e atômico o suficiente para não depender de outras unidades que não estiverem sendo testadas
  • 4. Testes unitários Sabemos que existe uma diferença entre testes de caixa-preta e caixa-branca.
  • 5. Testes unitários Testes de caixa-preta verificam as saídas de um sistema com base nas entradas inputadas, sem um prévio conhecimento sobre a estrutura do programa. Testes de caixa-branca verificam comportamentos internos da estrutura do software para serem abordados nos casos de teste.
  • 6. Testes unitários E que os testes unitários se encaixam no conceito de testes de caixa-branca… … pois permitem ao desenvolvedor construir testes diretamente baseados no código-fonte e nos comportamentos apresentados pelas unidades do software.
  • 7. Testes unitários Porém apesar de todos os recursos disponíveis com o JUnit e na linguagem Java, construir testes realmente úteis ainda é um desafio. Testes baseados apenas em retorno de métodos não são suficientes para cobrir o código. Falta interagir com o método de maneira mais livre.
  • 8. Como assim? ● E todas as decisões tomadas no código? ● E os comportamentos implícitos no teste? ● E todo o processo realizado até devolver o resultado do método? ○ Será que nada disso é relevante para o teste? ● E se o retorno do método não me disser exatamente o que ele fez? ● E como testar um método sem retorno?
  • 10. Mockito: simpler and better mocking Mockito permite: ● ter maior flexibilidade na hora de testar cada comportamento; ● isolar a unidade testada do restante do código; ● manter os testes legíveis e simples Keep It Simple, Stupid...
  • 11. Problema Eu quero testar um comportamento que inativa um determinado usuário do sistema após a terceira tentativa de informar a senha. Porém: ● Não quero que o teste unitário se preocupe com questões de acesso ao banco de dados; ● Quero verificar apenas se o status foi alterado e se o método de salvar no banco de dados foi chamado;
  • 12. Sugestão Trabalhar com Mockito pode ajudar a resolver esse problema. Primeiramente é preciso baixar a biblioteca do framework em Java através de um .jar disponível através do link http://code.google. com/p/mockito/ E não esqueça de importá-la em seu projeto.
  • 14. Resolução Passos: ● Importar os métodos estáticos da biblioteca para dentro da classe de testes; ● "Mockar" a classe UserDao, para simular a interação com o banco de dados; ● Chamar o método login() que será testado a partir da classe UserService; ● Usar o verify() do Mockito para verificar se método login() chama o update() na terceira vez que a senha estiver incorreta.
  • 15. Vantagens Desta maneira eu garanto que o meu código invocará o acesso ao banco de dados quando necessário,… … porém os meus testes não sofrerão com as instabilidades do banco de dados, pois não dependem disso para funcionarem.
  • 16. Assim fica fácil Com isso manter uma suíte de testes unitários fica muito mais seguro e tranquilo.
  • 17. Mockito O mockito é utilizado para sobrescrever comportamentos dependentes que fogem ao escopo do teste implementado. Não faz sentido permitir que problemas envolvidos com a classe UserDao afetem os testes realizados sobre a classe UserService. Usando o Mockito, todos os métodos da classe UserDao são sobrescritos e retornam 'null'
  • 18. Mockito Com um "mock" em mãos, podemos verificar quantas vezes um determinado método foi invocado, manipular o comportamento informando um retorno "fake" para simular o funcionamento normal da classe, capturar um determinado objeto enviado por parâmetro, e etc.
  • 19. Verify Usando o método verify(), é possível verificar quantas vezes um determinado método "mockado" foi chamado durante o teste. Isso é possível através dos métodos times(), never(), only(), atLeast(), atMost(), calls(), atLeastOnce(), com os respectivos parâmetros. Ex.: verify(dao, never()).update(any(User.class));
  • 20. Verify Veja no exemplo abaixo… ● Construímos uma lista com 5 usuários ● Invocamos um serviço que deve cadasrtrar todos os usuários listados ● verificamos se o método save foi chamado 5 vezes passando qualquer instância da classe 'User'
  • 21. when().thenReturn() O método when() permite simular retornos de métodos ou lançamentos de exceção. Dado que eu não quero que um método seja executado, porém eu dependo de um retorno para que o método testado continue funcionando… Então eu informo qual objeto deve ser retornado quando o método for invocado.
  • 22. when().thenReturn() Dado que o método save() será invocado pelo service.register() Quando isso acontecer, ele deve apenas retornar o mesmo objeto passado por parâmetro Sem realizar operações sobre o banco de dados…
  • 23. any(),… Existem vários matcher que podem ser usados para inferir sobre os parâmetros passados nos métodos… any(class), anyLong(), anyString(), indicando que será esperado qualquer parâmetro de um determinado tipo… Também é possível dizer o valor exato que será esperado através do eq()
  • 24. e muito mais… Para os curiosos, existem também alternativas para capturar argumentos em chamadas de métodos, usando o ArgumentCaptor… … fazer verificações em objetos concretos não mockados, através do spy()… e utilizar vários matchers úteis como isNull(), same(), startsWith(), endsWith(), contains(), isA(class), doNothing(), doThrow(),…
  • 25. Use mockito nos seus testes,
  • 26. … e deixe a brincadeira acontecer