SlideShare uma empresa Scribd logo
Testando o difícil e o quase “impossível”
EDER NOGUEIRA
GEORGE FREIRE
IMD0028 - FERRAMENTAS PARA AUTOMAÇÃO DE TESTES
RESIDÊNCIA EM ENGENHARIA DE SOFTWARE
INSTITUTO METRÓPOLE DIGITAL/ UFRN
Agenda
Unit Testing: Fáceis x Difíceis
O que são os Mocks?
Cenário das Ferramentas Mock;
Porque o PowerMock;
Quando Usar x Quando Não Usar;
Metendo a mão na massa;
Conclusões;
Referências Bibliográficas;
Unit Testing: Fáceis x Difíceis
 Testes unitários são fáceis quando:
◦ Seu código não depende de nada: Sem arquivos
de sistema, conexões com bancos de dados,
web services, sockets;
◦ Não possua dependências com outros
componentes, frameworks, etc;
◦ São automatizados para executá-los quantas
vezes for necessário;
◦ Precisam ser testados com a segurança
necessária;
◦ Resumindo:
CÓDIGO FÁCIL DE SER TESTADO É CÓDIGO
ISOLADO,SEGURO E AUTOMATIZADO.
Unit Testing: Fáceis x Difíceis
 Easy Tests:
 Hard Tests:
Class Under
Test
Test Class
Class Under
Test
Test Class
Unit Testing: Fáceis x Difíceis
 Para testes difíceis, removemos as
dependências usando os objetos mock;
Class Under
Test
Test Class
m
o
c
k
m
o
c
k
m
o
c
km
o
c
k
O que são Mocks?
 Segundo os especialistas:
◦ Martin Fowler: O termo “mock object” surgiu
dentro da comunidade XP e:
“...tornou-se popular para descrever um caso especial de
objetos que imitam objetos reais para teste”.
◦ Gerard Meszaro: Os mocks são:
“...objetos pré-programados com informações que formam
uma especificação das chamadas que esperam receber”.
Fazem parte de uma classe de objetos falsos usados para
propósito de testes, na qual ainda fazem parte os objetos
dummy, fake e stubs;
O que são Mocks?
 Sendo mais claro, os objetos mock:
◦ Simulam objetos reais;
◦ Modularizam melhor os testes;
◦ Gravam e examinam as expectativas das
chamadas, verificando se foram atendidas;
◦ Usam as mesmas interfaces do objeto real;
◦ Realizam verificações de estado e de
comportamento;
O que são Mocks?
 Situações reais: Se um objeto tem alguma das
características a seguir, é provável que um objeto
mock possa ser utilizado em seu lugar:
◦ Gera resultados não determinísticos (e.g. a hora ou
temperatura atual);
◦ Tem estados que são difíceis de criar ou reproduzir (e.g.
erro de comunicação da rede);
◦ É lento (e.g. um banco de dados completo que precisa ser
inicializado antes do teste);
◦ Ainda não existe ou pode ter comportamento alterado;
◦ Teriam que adicionar informações e métodos
exclusivamente para os testes (e não para sua função
real).
◦ Mapeamento Objeto-Relacional (ORM): Quando
trabalhamos com ORM, os mock-object nos auxiliam a
testar as operações de forma desconectada e validar se
as operações estão sendo chamadas a contento;
O que são Mocks?
 Exemplo: Testar um sistema que envia
SMS
◦ Solução Tradicional:
◦ Criar um teste unitário que teste o envio utilizando o
próprio provedor de SMS;
◦ Problema da Solução: Para cada SMS enviado, terá que
ser pago as tarifas do SMS;
◦ Conclusão: QUANTO MAIOR O Nº DE TESTES, MAIOR O
CUSTO;
O que são Mocks?
 Exemplo: Testar um sistema que envia
SMS
◦ Solução com objetos Mock:
 Os objetos Mock simularão o comportamento dos
objetos “reais” da aplicação, de forma controlada
pelo desenvolvedor;
 Este objeto será idêntico, ou seja, conterá os
mesmos métodos e parâmetros do original, que
não fará efetivamente o envio;
 Logo, os testes poderão ser realizados sem custo e
ainda poderá ser simulado outras situações, como
a queda do serviço por parte da operadora;
Cenário das Ferramentas Mock
 Ruby
◦ Mocha: http://mocha.rubyforge.org/
◦ Rspec: http://rspec.rubyforge.org/
◦ FlexMock: http://onestepback.org/software/flexmock/
 .NET
◦ Rhino Mocks: http://www.ayende.com/projects/rhino-mocks.aspx
◦ Nmock: http://nmock.org/
◦ Moq: http://code.google.com/p/moq/
◦ TypeMock: http://www.typemock.com/
◦ Attach: http://www.codeplex.com/attach
 C++
◦ MockPP: http://mockpp.sf.net/
◦ Amop: http://code.google.com/p/amop
 ActionScript:
◦ As2lib Mock Object: http://www.as2lib.org/
 PHP
◦ SimpleTest: http://simpletest.org/
◦ Yay! Mock: http://yaymock.googlecode.com/
Cenário das Ferramentas Mock
 JAVA
◦ jMock: http://www.jmock.org/
◦ rMock: http://rmock.sourceforge.net/
◦ SevenMock: http://seven-mock.sourceforge.net/
◦ EasyMock: http://www.easymock.org/
◦ Mockito: http://code.google.com/p/mockito/
◦ PowerMock:
https://code.google.com/p/powermock/
Porque o PowerMock?
 Open-Source;
 Performance:
◦ Carregador de classes e de bytecode personalizado;
◦ Injeção de Dependência é muito custoso com chamadas a métodos
estáticos. PowerMock permite a simulação destes métodos;
 Design:
◦ Possibilidade de simular métodos estáticos, privados, inicializadores
estáticos, final classes, que outras bibliotecas não possuem;
◦ Inclui muitas ferramentas que simplificam o uso de reflection,
especialmente úteis para testes e facilitam o acesso ao estado interno
do objeto testado.
 3rd Party:
◦ O PowerMock oferece suporte a bibliotecas de mock existentes,
como EasyMock e Mockito, além das ferramentas de teste
TestNG e JUnit, possuindo a vantagem de se utilizar de um menor
número de métodos e anotações e oferecendo recursos extras;
◦ Integração com o Spring e Maven;
Quando Usar x Quando Não Usar
 Quando Usar:
◦ Padrões Singleton ou Factory Method estático;
◦ Quando possuir um legado de testes escritos em EasyMock ou
Mockito: Devido a limitação destas ferramentas, deve-se usar as
extensões do PowerMock para um conjunto de funcionalidades mais
completo;
◦ Além dos testes unitários, pode ser utilizado em testes de
integração (e.g. @PowerMockIgnore ({“org.xml.*”,”javax.xml.*”} faz
com que o carregador de classes do PowerMock ignore estes pacotes)
 Quando Não Usar:
◦ Quando não possuir o modelo preciso do comportamento/estado
do objeto que está querendo ser simulado;
◦ PowerMock foi desenvolvido por experts em teste unitário. Portanto, seu
uso não é indicado para desenvolvedores principiantes;
◦ Quando usa-se outras ferramentas de testes que não seja o JUnit
ou o TestNG.
Metendo a mão na massa
1. Configuração do Ambiente:
◦ Acesse a página:
https://code.google.com/p/powermock/downloa
ds/list e faça do download do arquivo que
contém o powermock-easymock-junit-X.X.X;
◦ No exemplo a seguir, usaremos a IDE Eclipse +
plugin do JUnit 4;
◦ Crie um Java Project e adicione os .jars do
arquivo baixado para dentro do projeto.
◦ Para usuários Maven, JUnit, TestNG ou Mockito,
há outras bibliotecas disponíveis para este tipo
de projeto;
Metendo a mão na massa
2. Conhecendo o projeto FinalMocking:
 Neste exemplo, mostraremos como simular e
testar uma situação com classe e métodos com
marcação final:
 Relembrando: Classes com atributos final não
poder ser herdadas; métodos com esta marcação
não podem ser reescritos; e variáveis com este
adjetivo geralmente representam valores
constantes;
 Classes do Projeto: StateHolder.java,
StateFormatter.java e StateFormatterTest.java
Metendo a mão na massa
I. StateHolder.java:
 Classe auxiliar da classe StateFormatter que
contém as marcações final;
II. StateFormatter.java
 Simples classe que interage com seu
colaborador;
III. StateFormatterTest.java
 O teste propriamente dito;
IV. Propósito:
 Mostrar que o Powermock tem a capacidade
de criar um mock do colaborador, mesmo
que seja final, e esperar chamadas de
métodos, embora também seja final;
Metendo a mão na massa
public final class StateHolder {
/**
* @return The current state.
*/
public final String getState() {
// Imagine that we query a database for state
return null;
}
public final void setState(String state) {
// Imagine that we store the state in a database.
}
}
Metendo a mão na massa
public class StateFormatter {
private final StateHolder stateHolder;
public StateFormatter(StateHolder stateHolder) {
this.stateHolder = stateHolder;
}
public String getFormattedState() {
String safeState =
“Sem informação do estado do servidor.";
final String actualState = stateHolder.getState();
if (actualState != null) {
safeState = actualState;
}
return safeState;
}
}
Metendo a mão na massa
@RunWith(PowerMockRunner.class)
@PrepareForTest(StateHolder.class)
public class StateFormatterTest {
@Test
public void testGetFormattedState_actualStateExists() throws Exception {
final String expectedState = “servidor online";
StateHolder stateHolderMock = createMock(StateHolder.class);
StateFormatter tested = new StateFormatter(stateHolderMock);
expect(stateHolderMock.getState()).andReturn(expectedState);
replay(stateHolderMock);
final String actualState = tested.getFormattedState();
verify(stateHolderMock);
assertEquals(expectedState, actualState);
}
O PowerMock
cria um fake
“StateHolder”
O Powermock
ajuda a simular o
estado do
servidor;
Aqui, o PowerMock
prepara a classe
para teste por meior
de manipulação de
bytecode
Metendo a mão na massa
@Test
public void testGetFormattedState_noStateExists() throws Exception {
final String expectedState = "Sem informação do estado do servidor.";
StateHolder stateHolderMock = createMock(StateHolder.class);
StateFormatter tested = new StateFormatter(stateHolderMock);
expect(stateHolderMock.getState()).andReturn(null);
replay(stateHolderMock);
final String actualState = tested.getFormattedState();
verify(stateHolderMock);
assertEquals(expectedState, actualState);
}
}
Metendo a mão na massa
3. Copie o código das 3 classes para dentro
do seu projeto e execute o teste;
4. Todos os testes devem ocorrer sem falha:
Conclusões
 O PowerMock contém um rico conjunto de
funcionalidades que bibliotecas
tradicionais de teste unitário não
possuem;
 O PowerMock lhe ajudar a escrever o
melhor código, portanto, deve ser objeto
de estudo de qualquer desenvolvedor
Java;
Refererências Bibliográficas
1. Freeman, Steve;Pryce, Nat; Growing Object-Oriented Software
Guided by Tests [Paperback]; Addison-Wesley Professional;
2. https://code.google.com/p/powermock/
3. http://www.mockobjects.com/
4. http://pt.wikipedia.org/wiki/Mock_Object
5. http://martinfowler.com/articles/mocksArentStubs.html
6. http://xunitpatterns.com/
7. http://desenvolvimentoagil.com.br/xp/praticas/tdd/mock_objec
ts
8. http://imasters.com.br/artigo/8982/linguagens/conheca-os-
objetos-mock/
9. http://pt.slideshare.net/dodozhang21/mockito-presentation-
8319579
10.https://blog.42.nl/articles/mockito-powermock-vs-jmockit/
11.https://groups.google.com/forum/#!forum/powermock
12.http://www.jayway.com/tag/powermock/

Mais conteúdo relacionado

PPTX
Teste unitário
PDF
Teste de Integração - Unidade III
PDF
Testes de Integração
PDF
Testes: Por onde Começar?
PDF
Android DevConference - Refactoring for RxJava
PDF
Indo além com Automação de Testes de Apps Android
PDF
Aula Tratamento de Exceções
PDF
Programação Concorrente - Gerenciamento de Threads - Parte I
Teste unitário
Teste de Integração - Unidade III
Testes de Integração
Testes: Por onde Começar?
Android DevConference - Refactoring for RxJava
Indo além com Automação de Testes de Apps Android
Aula Tratamento de Exceções
Programação Concorrente - Gerenciamento de Threads - Parte I

Mais procurados (18)

PDF
Testes de Unidade - Unidade II
PDF
Programação Concorrente - Gerenciamento de Threads - Parte II
PDF
Nem tudo é Pepino: Cucumber x Robot Framework
PDF
Desenvolvimento Dirigido por Testes com Junit
PDF
Palestra Testes Unidade Com JUnit
PPTX
Como ser programador durante o dia e mesmo assim dormir bem à noite
PDF
Testes de Unidade com JUnit
PPT
OOP Java
PDF
Android: testes automatizados e TDD
PDF
Palestra Testes De Unidade Com JUnit
PPT
Aula5
PDF
05 - Sincronização de Threads - I
PDF
TDC2016POA | Trilha Android - Testes no Android
PPTX
Moq - Tips and Tricks
PPT
Junit 4.0
PPT
Excecoes
PPTX
Introdução a testes unitários com jUnit
PPT
Testes de Unidade - Unidade II
Programação Concorrente - Gerenciamento de Threads - Parte II
Nem tudo é Pepino: Cucumber x Robot Framework
Desenvolvimento Dirigido por Testes com Junit
Palestra Testes Unidade Com JUnit
Como ser programador durante o dia e mesmo assim dormir bem à noite
Testes de Unidade com JUnit
OOP Java
Android: testes automatizados e TDD
Palestra Testes De Unidade Com JUnit
Aula5
05 - Sincronização de Threads - I
TDC2016POA | Trilha Android - Testes no Android
Moq - Tips and Tricks
Junit 4.0
Excecoes
Introdução a testes unitários com jUnit
Anúncio

Semelhante a Power mock (20)

PDF
Mock objects - Teste de código com dependências
PPT
Mock Objects
PPTX
Mocking Test - QA Ninja Conf 2016
PPTX
Testes e mocks: Em Visual Studio com .NET
PPTX
Mocking Test - Outubro/2015
PPTX
Utilização de Mock Objects em Testes Unitários
PPTX
Mocking Test
PPTX
Mocking Test - GDG-SP - Setembro/2016
PPTX
Mocking Test - ThinkUp! - Abril/2017
PPTX
Test-driven development & Mocking
PPTX
Dubles de Testes - Na Pratica
PPTX
Mocks, Stubs e Fakes - Developers-SP - Julho-2017
PDF
JUnit Experience
PPTX
Testes Unitários
PPTX
Aulas 6: usando o Jest para fazer mocks to Mongoose, testando a função save
PPTX
Cobertura de Código: Testes de Unidade
PPTX
Testes Unitários - 1 Sessão beiraJUG
PPSX
Convergido: TDD + ATDD + BDD + xUnit Patterns + Dependency Injection
PPTX
TDD Primeiro Contato
PDF
JMockit & Hamcrest
Mock objects - Teste de código com dependências
Mock Objects
Mocking Test - QA Ninja Conf 2016
Testes e mocks: Em Visual Studio com .NET
Mocking Test - Outubro/2015
Utilização de Mock Objects em Testes Unitários
Mocking Test
Mocking Test - GDG-SP - Setembro/2016
Mocking Test - ThinkUp! - Abril/2017
Test-driven development & Mocking
Dubles de Testes - Na Pratica
Mocks, Stubs e Fakes - Developers-SP - Julho-2017
JUnit Experience
Testes Unitários
Aulas 6: usando o Jest para fazer mocks to Mongoose, testando a função save
Cobertura de Código: Testes de Unidade
Testes Unitários - 1 Sessão beiraJUG
Convergido: TDD + ATDD + BDD + xUnit Patterns + Dependency Injection
TDD Primeiro Contato
JMockit & Hamcrest
Anúncio

Mais de Eder Nogueira (20)

PDF
COBIT 5
PDF
DETRAN MAIS FÁCIL: CONSTRUÇÃO DE APP WEB USANDO O FRAMEWORK ÁGIL YII
PDF
DETRAN MAIS FÁCIL: CONSTRUÇÃO DE APP WEB USANDO O FRAMEWORK ÁGIL YII
PDF
Títulos de Renda Fixa
PPTX
HIstóricos e Causas da Inflação
PPTX
Kant e a Ética do Dever
DOCX
Projeto Político Pedagógico - Parte I - Versão FULL
PPTX
PROJETO POLÍTICO PEDAGÓGICO - DIAGNÓSTICO ESCOLAR
PPTX
ATENDIMENTO EDUCACIONAL ESPECIALIZADO - DOCENTES
PPTX
ATENDIMENTO EDUCACIONAL ESPECIALIZADO - PAIS
PPTX
APRESENTAÇÃO DO PPP ESCOLA MUN. PROF. LUIZ MARANHÃO FILHO PARTE I - ALUNOS
PPT
APRESENTAÇÃO DO PPP ESCOLA MUN. PROF. LUIZ MARANHÃO FILHO PARTE I - ESCOLA
PPT
CERTIFICAÇÃO DE QUALIDADE: ISO
PPT
Ferramentas Colaborativas
PDF
Tutorial JBoss Seam
DOC
UTILIZANDO O FRAMEWORK JBOSS SEAM PARA ACELERAR O DESENVOLVIMENTO DE APLICAÇÕ...
PPTX
Padrão de Projeto Mediator
PPT
JAVA MEDIA FRAMEWORK
DOC
PROGRAMAÇÃO DECLARATIVA COM JAVAFX: UM PARADIGMA NA CONSTRUÇÃO DE INTERFACES ...
PPTX
JavaFX - Uma visão Geral
COBIT 5
DETRAN MAIS FÁCIL: CONSTRUÇÃO DE APP WEB USANDO O FRAMEWORK ÁGIL YII
DETRAN MAIS FÁCIL: CONSTRUÇÃO DE APP WEB USANDO O FRAMEWORK ÁGIL YII
Títulos de Renda Fixa
HIstóricos e Causas da Inflação
Kant e a Ética do Dever
Projeto Político Pedagógico - Parte I - Versão FULL
PROJETO POLÍTICO PEDAGÓGICO - DIAGNÓSTICO ESCOLAR
ATENDIMENTO EDUCACIONAL ESPECIALIZADO - DOCENTES
ATENDIMENTO EDUCACIONAL ESPECIALIZADO - PAIS
APRESENTAÇÃO DO PPP ESCOLA MUN. PROF. LUIZ MARANHÃO FILHO PARTE I - ALUNOS
APRESENTAÇÃO DO PPP ESCOLA MUN. PROF. LUIZ MARANHÃO FILHO PARTE I - ESCOLA
CERTIFICAÇÃO DE QUALIDADE: ISO
Ferramentas Colaborativas
Tutorial JBoss Seam
UTILIZANDO O FRAMEWORK JBOSS SEAM PARA ACELERAR O DESENVOLVIMENTO DE APLICAÇÕ...
Padrão de Projeto Mediator
JAVA MEDIA FRAMEWORK
PROGRAMAÇÃO DECLARATIVA COM JAVAFX: UM PARADIGMA NA CONSTRUÇÃO DE INTERFACES ...
JavaFX - Uma visão Geral

Último (19)

PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PPTX
Aula 18 - Manipulacao De Arquivos python
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PDF
Apple Pippin Uma breve introdução. - David Glotz
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PDF
Aula04-Academia Heri- Tecnologia Geral 2025
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PDF
Processos na gestão de transportes, TM100 Col18
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Aula 18 - Manipulacao De Arquivos python
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Apple Pippin Uma breve introdução. - David Glotz
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Aula04-Academia Heri- Tecnologia Geral 2025
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Processos na gestão de transportes, TM100 Col18
Custos e liquidação no SAP Transportation Management, TM130 Col18
COBITxITIL-Entenda as diferença em uso governança TI
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx

Power mock

  • 1. Testando o difícil e o quase “impossível” EDER NOGUEIRA GEORGE FREIRE IMD0028 - FERRAMENTAS PARA AUTOMAÇÃO DE TESTES RESIDÊNCIA EM ENGENHARIA DE SOFTWARE INSTITUTO METRÓPOLE DIGITAL/ UFRN
  • 2. Agenda Unit Testing: Fáceis x Difíceis O que são os Mocks? Cenário das Ferramentas Mock; Porque o PowerMock; Quando Usar x Quando Não Usar; Metendo a mão na massa; Conclusões; Referências Bibliográficas;
  • 3. Unit Testing: Fáceis x Difíceis  Testes unitários são fáceis quando: ◦ Seu código não depende de nada: Sem arquivos de sistema, conexões com bancos de dados, web services, sockets; ◦ Não possua dependências com outros componentes, frameworks, etc; ◦ São automatizados para executá-los quantas vezes for necessário; ◦ Precisam ser testados com a segurança necessária; ◦ Resumindo: CÓDIGO FÁCIL DE SER TESTADO É CÓDIGO ISOLADO,SEGURO E AUTOMATIZADO.
  • 4. Unit Testing: Fáceis x Difíceis  Easy Tests:  Hard Tests: Class Under Test Test Class Class Under Test Test Class
  • 5. Unit Testing: Fáceis x Difíceis  Para testes difíceis, removemos as dependências usando os objetos mock; Class Under Test Test Class m o c k m o c k m o c km o c k
  • 6. O que são Mocks?  Segundo os especialistas: ◦ Martin Fowler: O termo “mock object” surgiu dentro da comunidade XP e: “...tornou-se popular para descrever um caso especial de objetos que imitam objetos reais para teste”. ◦ Gerard Meszaro: Os mocks são: “...objetos pré-programados com informações que formam uma especificação das chamadas que esperam receber”. Fazem parte de uma classe de objetos falsos usados para propósito de testes, na qual ainda fazem parte os objetos dummy, fake e stubs;
  • 7. O que são Mocks?  Sendo mais claro, os objetos mock: ◦ Simulam objetos reais; ◦ Modularizam melhor os testes; ◦ Gravam e examinam as expectativas das chamadas, verificando se foram atendidas; ◦ Usam as mesmas interfaces do objeto real; ◦ Realizam verificações de estado e de comportamento;
  • 8. O que são Mocks?  Situações reais: Se um objeto tem alguma das características a seguir, é provável que um objeto mock possa ser utilizado em seu lugar: ◦ Gera resultados não determinísticos (e.g. a hora ou temperatura atual); ◦ Tem estados que são difíceis de criar ou reproduzir (e.g. erro de comunicação da rede); ◦ É lento (e.g. um banco de dados completo que precisa ser inicializado antes do teste); ◦ Ainda não existe ou pode ter comportamento alterado; ◦ Teriam que adicionar informações e métodos exclusivamente para os testes (e não para sua função real). ◦ Mapeamento Objeto-Relacional (ORM): Quando trabalhamos com ORM, os mock-object nos auxiliam a testar as operações de forma desconectada e validar se as operações estão sendo chamadas a contento;
  • 9. O que são Mocks?  Exemplo: Testar um sistema que envia SMS ◦ Solução Tradicional: ◦ Criar um teste unitário que teste o envio utilizando o próprio provedor de SMS; ◦ Problema da Solução: Para cada SMS enviado, terá que ser pago as tarifas do SMS; ◦ Conclusão: QUANTO MAIOR O Nº DE TESTES, MAIOR O CUSTO;
  • 10. O que são Mocks?  Exemplo: Testar um sistema que envia SMS ◦ Solução com objetos Mock:  Os objetos Mock simularão o comportamento dos objetos “reais” da aplicação, de forma controlada pelo desenvolvedor;  Este objeto será idêntico, ou seja, conterá os mesmos métodos e parâmetros do original, que não fará efetivamente o envio;  Logo, os testes poderão ser realizados sem custo e ainda poderá ser simulado outras situações, como a queda do serviço por parte da operadora;
  • 11. Cenário das Ferramentas Mock  Ruby ◦ Mocha: http://mocha.rubyforge.org/ ◦ Rspec: http://rspec.rubyforge.org/ ◦ FlexMock: http://onestepback.org/software/flexmock/  .NET ◦ Rhino Mocks: http://www.ayende.com/projects/rhino-mocks.aspx ◦ Nmock: http://nmock.org/ ◦ Moq: http://code.google.com/p/moq/ ◦ TypeMock: http://www.typemock.com/ ◦ Attach: http://www.codeplex.com/attach  C++ ◦ MockPP: http://mockpp.sf.net/ ◦ Amop: http://code.google.com/p/amop  ActionScript: ◦ As2lib Mock Object: http://www.as2lib.org/  PHP ◦ SimpleTest: http://simpletest.org/ ◦ Yay! Mock: http://yaymock.googlecode.com/
  • 12. Cenário das Ferramentas Mock  JAVA ◦ jMock: http://www.jmock.org/ ◦ rMock: http://rmock.sourceforge.net/ ◦ SevenMock: http://seven-mock.sourceforge.net/ ◦ EasyMock: http://www.easymock.org/ ◦ Mockito: http://code.google.com/p/mockito/ ◦ PowerMock: https://code.google.com/p/powermock/
  • 13. Porque o PowerMock?  Open-Source;  Performance: ◦ Carregador de classes e de bytecode personalizado; ◦ Injeção de Dependência é muito custoso com chamadas a métodos estáticos. PowerMock permite a simulação destes métodos;  Design: ◦ Possibilidade de simular métodos estáticos, privados, inicializadores estáticos, final classes, que outras bibliotecas não possuem; ◦ Inclui muitas ferramentas que simplificam o uso de reflection, especialmente úteis para testes e facilitam o acesso ao estado interno do objeto testado.  3rd Party: ◦ O PowerMock oferece suporte a bibliotecas de mock existentes, como EasyMock e Mockito, além das ferramentas de teste TestNG e JUnit, possuindo a vantagem de se utilizar de um menor número de métodos e anotações e oferecendo recursos extras; ◦ Integração com o Spring e Maven;
  • 14. Quando Usar x Quando Não Usar  Quando Usar: ◦ Padrões Singleton ou Factory Method estático; ◦ Quando possuir um legado de testes escritos em EasyMock ou Mockito: Devido a limitação destas ferramentas, deve-se usar as extensões do PowerMock para um conjunto de funcionalidades mais completo; ◦ Além dos testes unitários, pode ser utilizado em testes de integração (e.g. @PowerMockIgnore ({“org.xml.*”,”javax.xml.*”} faz com que o carregador de classes do PowerMock ignore estes pacotes)  Quando Não Usar: ◦ Quando não possuir o modelo preciso do comportamento/estado do objeto que está querendo ser simulado; ◦ PowerMock foi desenvolvido por experts em teste unitário. Portanto, seu uso não é indicado para desenvolvedores principiantes; ◦ Quando usa-se outras ferramentas de testes que não seja o JUnit ou o TestNG.
  • 15. Metendo a mão na massa 1. Configuração do Ambiente: ◦ Acesse a página: https://code.google.com/p/powermock/downloa ds/list e faça do download do arquivo que contém o powermock-easymock-junit-X.X.X; ◦ No exemplo a seguir, usaremos a IDE Eclipse + plugin do JUnit 4; ◦ Crie um Java Project e adicione os .jars do arquivo baixado para dentro do projeto. ◦ Para usuários Maven, JUnit, TestNG ou Mockito, há outras bibliotecas disponíveis para este tipo de projeto;
  • 16. Metendo a mão na massa 2. Conhecendo o projeto FinalMocking:  Neste exemplo, mostraremos como simular e testar uma situação com classe e métodos com marcação final:  Relembrando: Classes com atributos final não poder ser herdadas; métodos com esta marcação não podem ser reescritos; e variáveis com este adjetivo geralmente representam valores constantes;  Classes do Projeto: StateHolder.java, StateFormatter.java e StateFormatterTest.java
  • 17. Metendo a mão na massa I. StateHolder.java:  Classe auxiliar da classe StateFormatter que contém as marcações final; II. StateFormatter.java  Simples classe que interage com seu colaborador; III. StateFormatterTest.java  O teste propriamente dito; IV. Propósito:  Mostrar que o Powermock tem a capacidade de criar um mock do colaborador, mesmo que seja final, e esperar chamadas de métodos, embora também seja final;
  • 18. Metendo a mão na massa public final class StateHolder { /** * @return The current state. */ public final String getState() { // Imagine that we query a database for state return null; } public final void setState(String state) { // Imagine that we store the state in a database. } }
  • 19. Metendo a mão na massa public class StateFormatter { private final StateHolder stateHolder; public StateFormatter(StateHolder stateHolder) { this.stateHolder = stateHolder; } public String getFormattedState() { String safeState = “Sem informação do estado do servidor."; final String actualState = stateHolder.getState(); if (actualState != null) { safeState = actualState; } return safeState; } }
  • 20. Metendo a mão na massa @RunWith(PowerMockRunner.class) @PrepareForTest(StateHolder.class) public class StateFormatterTest { @Test public void testGetFormattedState_actualStateExists() throws Exception { final String expectedState = “servidor online"; StateHolder stateHolderMock = createMock(StateHolder.class); StateFormatter tested = new StateFormatter(stateHolderMock); expect(stateHolderMock.getState()).andReturn(expectedState); replay(stateHolderMock); final String actualState = tested.getFormattedState(); verify(stateHolderMock); assertEquals(expectedState, actualState); } O PowerMock cria um fake “StateHolder” O Powermock ajuda a simular o estado do servidor; Aqui, o PowerMock prepara a classe para teste por meior de manipulação de bytecode
  • 21. Metendo a mão na massa @Test public void testGetFormattedState_noStateExists() throws Exception { final String expectedState = "Sem informação do estado do servidor."; StateHolder stateHolderMock = createMock(StateHolder.class); StateFormatter tested = new StateFormatter(stateHolderMock); expect(stateHolderMock.getState()).andReturn(null); replay(stateHolderMock); final String actualState = tested.getFormattedState(); verify(stateHolderMock); assertEquals(expectedState, actualState); } }
  • 22. Metendo a mão na massa 3. Copie o código das 3 classes para dentro do seu projeto e execute o teste; 4. Todos os testes devem ocorrer sem falha:
  • 23. Conclusões  O PowerMock contém um rico conjunto de funcionalidades que bibliotecas tradicionais de teste unitário não possuem;  O PowerMock lhe ajudar a escrever o melhor código, portanto, deve ser objeto de estudo de qualquer desenvolvedor Java;
  • 24. Refererências Bibliográficas 1. Freeman, Steve;Pryce, Nat; Growing Object-Oriented Software Guided by Tests [Paperback]; Addison-Wesley Professional; 2. https://code.google.com/p/powermock/ 3. http://www.mockobjects.com/ 4. http://pt.wikipedia.org/wiki/Mock_Object 5. http://martinfowler.com/articles/mocksArentStubs.html 6. http://xunitpatterns.com/ 7. http://desenvolvimentoagil.com.br/xp/praticas/tdd/mock_objec ts 8. http://imasters.com.br/artigo/8982/linguagens/conheca-os- objetos-mock/ 9. http://pt.slideshare.net/dodozhang21/mockito-presentation- 8319579 10.https://blog.42.nl/articles/mockito-powermock-vs-jmockit/ 11.https://groups.google.com/forum/#!forum/powermock 12.http://www.jayway.com/tag/powermock/