SlideShare uma empresa Scribd logo
1 de 14
Baixar para ler offline
J820

Mock objects

Testes de código
com dependências

Helder da Rocha (helder@acm.org)

argonavis.com.br
Como lidar com testes difíceis
Testes devem ser simples e suficientes
Comece com testes mais importantes
Sempre pode-se escrever novos testes, quando necessário

Não complique
Não teste o que é responsabilidade de outra classe/método
Assuma que outras classes e métodos funcionam

argonavis.com.br

Testes difíceis (ou que parecem difíceis)
Aplicações gráficas: eventos, layouts, threads
Objetos inaccessíveis, métodos privativos, Singletons
Objetos que dependem de outros objetos
Objetos cujo estado varia devido a fatores imprevisíveis

Soluções
Alterar o design da aplicação para facilitar os testes
Simular dependências usando proxies e stubs

2
Como testar GUIs
O que testar?
Assumir que GUI (Swing, AWT, etc.) funciona
Concentrar-se na lógica de negócio e não na UI

Como testar?

argonavis.com.br

"Emagrecer" o código para reduzir a chance de falha
Usar MVC: isolar lógica de apresentação e controle
Separar código confiável do código que pode falhar
Usar mediadores (Mediator pattern) para intermediar
interações entre componentes

Exemplo: event handlers
Devem ter 0% de lógica de negócio: "A Stupid GUI is an
Unbreakable GUI" (Robert Koss, Object Mentor)
Responsabilidades delegadas a mediadores testáveis
3
Dependência de código-fonte
Problema
Como testar componente que depende do código de
outros componentes?
Classe-alvo não oferece o que testar:
Tanque
+nivel()
CarroTest

Carro

+testAcelera()

+acelera()

Ignição

argonavis.com.br

+ligada()

Se ligado e houver combustível
método void acelera() public void testAcelera() {
Carro carro =
deve funcionar
new Carro();
Como saber?
carro.acelera();
assert???(???);
}
Fonte: www.objectmentor.com, 2002

4
Stubs: objetos "impostores"
É possível remover dependências de código-fonte
refatorando o código para usar interfaces
depois

antes
A

B

«interface»
InterB

A

B

A não conhece mais o
tipo concreto de B

Agora B pode ser substituída por um stub

argonavis.com.br

BStub está sob controle total de ATest (1)
Em alguns casos, ATest pode implementar InterB (2)

ATest

A

«interface»
InterB

A

«interface»
InterB

(2)

(1)

« cria »

ATest

BStub

B

self-shunt pattern

B

Fonte: www.objectmentor.com, 2002

5
Dependência: solução usando stubs
«interface»
Tanque
+nivel():float
CarroTest
+testTanqueVazioSemIgn()
+testTanqueCheioSemIgn()
+testTanqueVazioComIgn()
+testTanqueCheioComIgn()

argonavis.com.br

Quando usar stubs

TanqueImpl
+nivel():float

Carro
+acelera()
«interface»
Ignicao
+ligada(): bool

IgnicaoImpl
+ligada():bool

Dependência não existe ainda (não está pronta)
Dependências tem estado mutante, imprevisível ou
estão indisponíveis durante o desenvolvimento
BDs, servidores de aplicação, servidores Web, hardware
Fonte: www.objectmentor.com, 2002

6
Dependências de servidores
Use stubs para simular serviços e dados
É preciso implementar classes que devolvam as respostas
esperadas para diversas situações
Complexidade muito grande da dependência pode não
compensar investimento (mas não deixe de fazer testes
por causa disto!)
Vários tipos de stubs: mock objects, self-shunts.

argonavis.com.br

Use proxies (mediadores) para serviços reais
Oferecem interface para simular comunicação e testa a
integração real do componente com seu ambiente
Não é teste unitário: teste pode falhar quando código
está correto (se os fatores externos falharem)
Exemplo: Cactus, HttpUnit

7
Mock Objects
Mock objects (MO) é uma estratégia similar ao uso de
stubs mas que não implementa nenhuma lógica
Um mock object não é exatamente um stub, pois não
simula o funcionamento do objeto em qualquer situação

Comportamento é controlado pela classe de teste que
Define comportamento esperado (valores retornados, etc.)
Passa MO configurado para objeto a ser testado
Chama métodos do objeto (que usam o MO)
argonavis.com.br

Implementações open-source que facilitam uso de MOs
EasyMock (tammofreese.de/easymock/) e MockMaker
(www.xpdeveloper.com) geram MOs a partir de interfaces
Projeto MO (mockobjects.sourceforge.net) coleção de mock
objects e utilitários para usá-los
8
Exemplo de Mock Object
public interface Dependencia {
public String metodo();
}

argonavis.com.br

import mockmaker.ReturnValues;
import com.mockobjects.*;

Interface

Implementação "mock" da interface
gerada pelo mock maker

public class MockDependencia implements Dependencia{
private ExpectationCounter metodoCalls = new ... ;
private ReturnValues metodoReturnValues = new ... ;
public void setExpectedMetodoCalls(int calls){
metodoCalls.setExpected(calls);
métodos para
}
configuração do mock
public void setupMetodo(boolean arg){
object e resultados
metodoReturnValues.add(new Boolean(arg));
}
esperados
public void verify(){
metodoCalls.verify();
implementação
}
public boolean metodo(){
metodoCalls.inc();
Object nextReturnValue = metodoReturnValues.getNext();
return ((String) nextReturnValue).toString();
}
}

9
Usando um Mock Object
Objeto que usa Dependência.
Em tempo de desenvolvimento,
ela será implementada por um
Mock object.
import junit.framework.*;

public class DepClient {
private Dependencia dep;
public DepClient(Dependencia dep) {
this.dep = dep;
}
public String operacao(String texto) {
return dep.metodo(texto);
}
}

argonavis.com.br

public class DepClientTest extends TestCase {
private DepClient client;
private MockDependencia mockObject; // implements Dependencia!
public void setUp() {
mockObject = new MockDependencia();
client = new DepClient(mockObject);
mockObject.setExpectedMetodoCalls(1);
mockObject.setupMetodo("DADOS"); // define comportamento
}
public void testMetodo() throws java.io.IOException {
String result = client.operacao("dados");
assertEquals("DADOS", result);
mockObject.verify();
Test Case que usa um Mock Object
}
}

para simular uma dependência real

10
Como testar bancos de dados
Refatore seu código para que não seja necessário usar
mock objects para JDBC

argonavis.com.br

Forneça um DAO (Data-Access Object) que encapsule
os métodos de acesso ao banco que sua aplicação irá
utilizar
Escreva testes para a Interface do DAO
Escreva um stub para a interface do DAO ou gere um
mock object para ela

Outra alternativa é criar implementação de DAO que
faça acesso a banco pequeno, facilmente configurável
Muitas vezes é mais fácil testar no próprio sistema que
escrever os stubs e mock objects
11
Exercício
1. Gere um MockObject para testar a aplicação
fornecida que depende de um DAO

argonavis.com.br

Use o MockMaker
Escreva um test-case que utilize o mock object criado
pelo mock maker.
Escreva um segundo teste (no mesmo test case) que
use o DAO implementado (antes de executar, rode ant
create-table para criar a tabela)

12
Fontes
Documentação XDoclet. xdoclet.sourceforge.net
[2] Erik Hatcher. Java Development with Ant. Manning,
2003
[3] Eric Burke & Brian Coyner. Java eXtreme
Programming Cookbook. O'Reilly, 2003

argonavis.com.br

[1]

13
Curso J820
Produtividade e Qualidade em Java:
Ferramentas e Metodologias
Revisão 1.1

© 2002, 2003, Helder da Rocha
(helder@acm.org)

argonavis.com.br

Mais conteúdo relacionado

Mais procurados

Nodejs - A performance que eu sempre quis ter
Nodejs - A performance que eu sempre quis terNodejs - A performance que eu sempre quis ter
Nodejs - A performance que eu sempre quis terEmerson Macedo
 
Scrum - Conceitos, Práticas e Experiências - Manoel Pimentel
Scrum - Conceitos, Práticas e Experiências - Manoel PimentelScrum - Conceitos, Práticas e Experiências - Manoel Pimentel
Scrum - Conceitos, Práticas e Experiências - Manoel PimentelManoel Pimentel Medeiros
 
Introdução a Testes Automatizados
Introdução a Testes AutomatizadosIntrodução a Testes Automatizados
Introdução a Testes Automatizadoselliando dias
 
Scrum em 15 minutos
Scrum em 15 minutosScrum em 15 minutos
Scrum em 15 minutosSerge Rehem
 
Minicurso de JavaScript (Portuguese)
Minicurso de JavaScript (Portuguese)Minicurso de JavaScript (Portuguese)
Minicurso de JavaScript (Portuguese)Bruno Grange
 
Desvendando a linguagem JavaScript
Desvendando a linguagem JavaScriptDesvendando a linguagem JavaScript
Desvendando a linguagem JavaScriptRodrigo Branas
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com AngularElmano Cavalcanti
 
Curso Java Básico - Aula 01
Curso Java Básico - Aula 01Curso Java Básico - Aula 01
Curso Java Básico - Aula 01Natanael Fonseca
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Helder da Rocha
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven DevelopmentElias Nogueira
 
[Curso Java Basico] Aula 23: Como debugar no Netbeans
[Curso Java Basico] Aula 23: Como debugar no Netbeans[Curso Java Basico] Aula 23: Como debugar no Netbeans
[Curso Java Basico] Aula 23: Como debugar no NetbeansLoiane Groner
 
Introdução sobre desenvolvimento web
Introdução sobre desenvolvimento webIntrodução sobre desenvolvimento web
Introdução sobre desenvolvimento webRodrigo Rodrigues
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Helder da Rocha
 

Mais procurados (20)

Git e GitHub - Conceitos Básicos
Git e GitHub - Conceitos BásicosGit e GitHub - Conceitos Básicos
Git e GitHub - Conceitos Básicos
 
UML - Diagrama de Pacotes
UML - Diagrama de PacotesUML - Diagrama de Pacotes
UML - Diagrama de Pacotes
 
Modelos de Engenharia de Software
Modelos de Engenharia de SoftwareModelos de Engenharia de Software
Modelos de Engenharia de Software
 
Nodejs - A performance que eu sempre quis ter
Nodejs - A performance que eu sempre quis terNodejs - A performance que eu sempre quis ter
Nodejs - A performance que eu sempre quis ter
 
Scrum - Conceitos, Práticas e Experiências - Manoel Pimentel
Scrum - Conceitos, Práticas e Experiências - Manoel PimentelScrum - Conceitos, Práticas e Experiências - Manoel Pimentel
Scrum - Conceitos, Práticas e Experiências - Manoel Pimentel
 
Introdução React.js
Introdução React.jsIntrodução React.js
Introdução React.js
 
Curso de Desenvolvimento Web - Módulo 01 - HTML
Curso de Desenvolvimento Web - Módulo 01 - HTMLCurso de Desenvolvimento Web - Módulo 01 - HTML
Curso de Desenvolvimento Web - Módulo 01 - HTML
 
Introdução a Testes Automatizados
Introdução a Testes AutomatizadosIntrodução a Testes Automatizados
Introdução a Testes Automatizados
 
Scrum em 15 minutos
Scrum em 15 minutosScrum em 15 minutos
Scrum em 15 minutos
 
Minicurso de JavaScript (Portuguese)
Minicurso de JavaScript (Portuguese)Minicurso de JavaScript (Portuguese)
Minicurso de JavaScript (Portuguese)
 
Aula 1 - Revisão UML
Aula 1 - Revisão UMLAula 1 - Revisão UML
Aula 1 - Revisão UML
 
Desvendando a linguagem JavaScript
Desvendando a linguagem JavaScriptDesvendando a linguagem JavaScript
Desvendando a linguagem JavaScript
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com Angular
 
Curso Java Básico - Aula 01
Curso Java Básico - Aula 01Curso Java Básico - Aula 01
Curso Java Básico - Aula 01
 
Curso de Desenvolvimento Web - Módulo 03 - JavaScript
Curso de Desenvolvimento Web - Módulo 03 - JavaScriptCurso de Desenvolvimento Web - Módulo 03 - JavaScript
Curso de Desenvolvimento Web - Módulo 03 - JavaScript
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
 
[Curso Java Basico] Aula 23: Como debugar no Netbeans
[Curso Java Basico] Aula 23: Como debugar no Netbeans[Curso Java Basico] Aula 23: Como debugar no Netbeans
[Curso Java Basico] Aula 23: Como debugar no Netbeans
 
Introdução sobre desenvolvimento web
Introdução sobre desenvolvimento webIntrodução sobre desenvolvimento web
Introdução sobre desenvolvimento web
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)
 

Destaque

Mocks x Stubs - Entenda a diferença
Mocks x Stubs - Entenda a diferençaMocks x Stubs - Entenda a diferença
Mocks x Stubs - Entenda a diferençaVinicius Quaiato
 
Tdd Com Mock e Orientação a Objetos (PyNE 2015)
Tdd Com Mock e Orientação a Objetos (PyNE 2015)Tdd Com Mock e Orientação a Objetos (PyNE 2015)
Tdd Com Mock e Orientação a Objetos (PyNE 2015)Bernardo Fontes
 
Mock Objects Presentation
Mock Objects PresentationMock Objects Presentation
Mock Objects PresentationAndriy Buday
 
Testing with Mock Objects
Testing with Mock ObjectsTesting with Mock Objects
Testing with Mock ObjectsBen Carey
 
TDD and mock objects
TDD and mock objectsTDD and mock objects
TDD and mock objectsSteve Zhang
 
Mockito (JUG Latvia)
Mockito (JUG Latvia)Mockito (JUG Latvia)
Mockito (JUG Latvia)Dmitry Buzdin
 
Easymock Tutorial
Easymock TutorialEasymock Tutorial
Easymock TutorialSbin m
 
Advanced PHPUnit Testing
Advanced PHPUnit TestingAdvanced PHPUnit Testing
Advanced PHPUnit TestingMike Lively
 

Destaque (12)

Mocks x Stubs - Entenda a diferença
Mocks x Stubs - Entenda a diferençaMocks x Stubs - Entenda a diferença
Mocks x Stubs - Entenda a diferença
 
Mockito intro
Mockito introMockito intro
Mockito intro
 
Tdd Com Mock e Orientação a Objetos (PyNE 2015)
Tdd Com Mock e Orientação a Objetos (PyNE 2015)Tdd Com Mock e Orientação a Objetos (PyNE 2015)
Tdd Com Mock e Orientação a Objetos (PyNE 2015)
 
Mock object
Mock objectMock object
Mock object
 
Mock Objects Presentation
Mock Objects PresentationMock Objects Presentation
Mock Objects Presentation
 
Beyond TDD
Beyond TDDBeyond TDD
Beyond TDD
 
Testing with Mock Objects
Testing with Mock ObjectsTesting with Mock Objects
Testing with Mock Objects
 
TDD and mock objects
TDD and mock objectsTDD and mock objects
TDD and mock objects
 
Mockito (JUG Latvia)
Mockito (JUG Latvia)Mockito (JUG Latvia)
Mockito (JUG Latvia)
 
Easymock Tutorial
Easymock TutorialEasymock Tutorial
Easymock Tutorial
 
Mock objects in PHPUnit
Mock objects in PHPUnitMock objects in PHPUnit
Mock objects in PHPUnit
 
Advanced PHPUnit Testing
Advanced PHPUnit TestingAdvanced PHPUnit Testing
Advanced PHPUnit Testing
 

Semelhante a Mock objects - Teste de código com dependências

Android DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps AndroidAndroid DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps AndroidiMasters
 
Indo além com Automação de Testes de Apps Android
Indo além com Automação de Testes de Apps AndroidIndo além com Automação de Testes de Apps Android
Indo além com Automação de Testes de Apps AndroidEduardo Carrara de Araujo
 
Mocking Test - Outubro/2015
Mocking Test - Outubro/2015Mocking Test - Outubro/2015
Mocking Test - Outubro/2015Renato Groff
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junitcejug
 
Integração de Tecnologias
Integração de TecnologiasIntegração de Tecnologias
Integração de Tecnologiaselliando dias
 
Testes de Unidade - Unidade II
Testes de Unidade - Unidade IITestes de Unidade - Unidade II
Testes de Unidade - Unidade IIJoão Lourenço
 
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
 
Mocks, Stubs e Fakes - Developers-SP - Julho-2017
Mocks, Stubs e Fakes - Developers-SP - Julho-2017Mocks, Stubs e Fakes - Developers-SP - Julho-2017
Mocks, Stubs e Fakes - Developers-SP - Julho-2017Renato Groff
 
Mocking Test - GDG-SP - Setembro/2016
Mocking Test - GDG-SP - Setembro/2016Mocking Test - GDG-SP - Setembro/2016
Mocking Test - GDG-SP - Setembro/2016Renato Groff
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018Renato Groff
 
Por quê você deve utilizar TDD?
Por quê você deve utilizar TDD?Por quê você deve utilizar TDD?
Por quê você deve utilizar TDD?Wellington Moreira
 
BDD (Behavior-Driven Development) - Setembro/2015
BDD (Behavior-Driven Development) - Setembro/2015BDD (Behavior-Driven Development) - Setembro/2015
BDD (Behavior-Driven Development) - Setembro/2015Renato Groff
 

Semelhante a Mock objects - Teste de código com dependências (20)

Mocking Test
Mocking TestMocking Test
Mocking Test
 
Aula1
Aula1Aula1
Aula1
 
Testes: Por onde Começar?
Testes: Por onde Começar?Testes: Por onde Começar?
Testes: Por onde Começar?
 
Android DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps AndroidAndroid DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps Android
 
Indo além com Automação de Testes de Apps Android
Indo além com Automação de Testes de Apps AndroidIndo além com Automação de Testes de Apps Android
Indo além com Automação de Testes de Apps Android
 
Mocking Test - Outubro/2015
Mocking Test - Outubro/2015Mocking Test - Outubro/2015
Mocking Test - Outubro/2015
 
Programação Defensiva
Programação DefensivaProgramação Defensiva
Programação Defensiva
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junit
 
Integração de Tecnologias
Integração de TecnologiasIntegração de Tecnologias
Integração de Tecnologias
 
Testes de Unidade - Unidade II
Testes de Unidade - Unidade IITestes de Unidade - Unidade II
Testes de Unidade - Unidade II
 
Teste de Integração - Unidade III
Teste de Integração - Unidade IIITeste de Integração - Unidade III
Teste de Integração - Unidade III
 
Java e orientação a objetos
Java e orientação a objetosJava e orientação a objetos
Java e orientação a objetos
 
Mocks, Stubs e Fakes - Developers-SP - Julho-2017
Mocks, Stubs e Fakes - Developers-SP - Julho-2017Mocks, Stubs e Fakes - Developers-SP - Julho-2017
Mocks, Stubs e Fakes - Developers-SP - Julho-2017
 
Power mock
Power mockPower mock
Power mock
 
Mocking Test - GDG-SP - Setembro/2016
Mocking Test - GDG-SP - Setembro/2016Mocking Test - GDG-SP - Setembro/2016
Mocking Test - GDG-SP - Setembro/2016
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018
Testes na plataforma .NET: TDD, Mocks, BDD e Selenium - .NET SP - Abril-2018
 
Por quê você deve utilizar TDD?
Por quê você deve utilizar TDD?Por quê você deve utilizar TDD?
Por quê você deve utilizar TDD?
 
BDD (Behavior-Driven Development) - Setembro/2015
BDD (Behavior-Driven Development) - Setembro/2015BDD (Behavior-Driven Development) - Setembro/2015
BDD (Behavior-Driven Development) - Setembro/2015
 

Mais de Denis L Presciliano

Como construir aplicações gráficas e applets
Como construir aplicações gráficas e appletsComo construir aplicações gráficas e applets
Como construir aplicações gráficas e appletsDenis L Presciliano
 
Coleções Propriedade, Resources e Strings
Coleções Propriedade, Resources e StringsColeções Propriedade, Resources e Strings
Coleções Propriedade, Resources e StringsDenis L Presciliano
 
Funcamentos de Programação Concorrente
Funcamentos de Programação ConcorrenteFuncamentos de Programação Concorrente
Funcamentos de Programação ConcorrenteDenis L Presciliano
 
Reuso com Herança e Composição
Reuso com Herança e ComposiçãoReuso com Herança e Composição
Reuso com Herança e ComposiçãoDenis L Presciliano
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntDenis L Presciliano
 
Tipos, literais, operadoes e controle de fluxo
Tipos, literais, operadoes e controle de fluxoTipos, literais, operadoes e controle de fluxo
Tipos, literais, operadoes e controle de fluxoDenis L Presciliano
 
Como usar a documentação da API Java 2
Como usar a documentação da API Java 2Como usar a documentação da API Java 2
Como usar a documentação da API Java 2Denis L Presciliano
 
Configuração do ambiente JEdit + Ant
Configuração do ambiente JEdit + AntConfiguração do ambiente JEdit + Ant
Configuração do ambiente JEdit + AntDenis L Presciliano
 
Programação Orientada a objetos em Java
Programação Orientada a objetos em JavaProgramação Orientada a objetos em Java
Programação Orientada a objetos em JavaDenis L Presciliano
 

Mais de Denis L Presciliano (20)

Funmentos de Objetos Remotos
Funmentos de Objetos RemotosFunmentos de Objetos Remotos
Funmentos de Objetos Remotos
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
Como construir aplicações gráficas e applets
Como construir aplicações gráficas e appletsComo construir aplicações gráficas e applets
Como construir aplicações gráficas e applets
 
Classes internas
Classes internasClasses internas
Classes internas
 
Entrada e Saída
Entrada e SaídaEntrada e Saída
Entrada e Saída
 
Coleções Propriedade, Resources e Strings
Coleções Propriedade, Resources e StringsColeções Propriedade, Resources e Strings
Coleções Propriedade, Resources e Strings
 
Funcamentos de Programação Concorrente
Funcamentos de Programação ConcorrenteFuncamentos de Programação Concorrente
Funcamentos de Programação Concorrente
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
 
Erros, exceções e asserções
Erros, exceções e asserçõesErros, exceções e asserções
Erros, exceções e asserções
 
Interfaces e Porlimosfismo
Interfaces e PorlimosfismoInterfaces e Porlimosfismo
Interfaces e Porlimosfismo
 
Reuso com Herança e Composição
Reuso com Herança e ComposiçãoReuso com Herança e Composição
Reuso com Herança e Composição
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
 
Pacotes e Encapsulamento
Pacotes e EncapsulamentoPacotes e Encapsulamento
Pacotes e Encapsulamento
 
Como criar classes e objetos
Como criar classes e objetosComo criar classes e objetos
Como criar classes e objetos
 
Tipos, literais, operadoes e controle de fluxo
Tipos, literais, operadoes e controle de fluxoTipos, literais, operadoes e controle de fluxo
Tipos, literais, operadoes e controle de fluxo
 
Como usar a documentação da API Java 2
Como usar a documentação da API Java 2Como usar a documentação da API Java 2
Como usar a documentação da API Java 2
 
Configuração do ambiente JEdit + Ant
Configuração do ambiente JEdit + AntConfiguração do ambiente JEdit + Ant
Configuração do ambiente JEdit + Ant
 
Programação Orientada a objetos em Java
Programação Orientada a objetos em JavaProgramação Orientada a objetos em Java
Programação Orientada a objetos em Java
 
Introdução a tecnologia Java
Introdução a tecnologia JavaIntrodução a tecnologia Java
Introdução a tecnologia Java
 
Fundamentos de Sockets
Fundamentos de SocketsFundamentos de Sockets
Fundamentos de Sockets
 

Mock objects - Teste de código com dependências

  • 1. J820 Mock objects Testes de código com dependências Helder da Rocha (helder@acm.org) argonavis.com.br
  • 2. Como lidar com testes difíceis Testes devem ser simples e suficientes Comece com testes mais importantes Sempre pode-se escrever novos testes, quando necessário Não complique Não teste o que é responsabilidade de outra classe/método Assuma que outras classes e métodos funcionam argonavis.com.br Testes difíceis (ou que parecem difíceis) Aplicações gráficas: eventos, layouts, threads Objetos inaccessíveis, métodos privativos, Singletons Objetos que dependem de outros objetos Objetos cujo estado varia devido a fatores imprevisíveis Soluções Alterar o design da aplicação para facilitar os testes Simular dependências usando proxies e stubs 2
  • 3. Como testar GUIs O que testar? Assumir que GUI (Swing, AWT, etc.) funciona Concentrar-se na lógica de negócio e não na UI Como testar? argonavis.com.br "Emagrecer" o código para reduzir a chance de falha Usar MVC: isolar lógica de apresentação e controle Separar código confiável do código que pode falhar Usar mediadores (Mediator pattern) para intermediar interações entre componentes Exemplo: event handlers Devem ter 0% de lógica de negócio: "A Stupid GUI is an Unbreakable GUI" (Robert Koss, Object Mentor) Responsabilidades delegadas a mediadores testáveis 3
  • 4. Dependência de código-fonte Problema Como testar componente que depende do código de outros componentes? Classe-alvo não oferece o que testar: Tanque +nivel() CarroTest Carro +testAcelera() +acelera() Ignição argonavis.com.br +ligada() Se ligado e houver combustível método void acelera() public void testAcelera() { Carro carro = deve funcionar new Carro(); Como saber? carro.acelera(); assert???(???); } Fonte: www.objectmentor.com, 2002 4
  • 5. Stubs: objetos "impostores" É possível remover dependências de código-fonte refatorando o código para usar interfaces depois antes A B «interface» InterB A B A não conhece mais o tipo concreto de B Agora B pode ser substituída por um stub argonavis.com.br BStub está sob controle total de ATest (1) Em alguns casos, ATest pode implementar InterB (2) ATest A «interface» InterB A «interface» InterB (2) (1) « cria » ATest BStub B self-shunt pattern B Fonte: www.objectmentor.com, 2002 5
  • 6. Dependência: solução usando stubs «interface» Tanque +nivel():float CarroTest +testTanqueVazioSemIgn() +testTanqueCheioSemIgn() +testTanqueVazioComIgn() +testTanqueCheioComIgn() argonavis.com.br Quando usar stubs TanqueImpl +nivel():float Carro +acelera() «interface» Ignicao +ligada(): bool IgnicaoImpl +ligada():bool Dependência não existe ainda (não está pronta) Dependências tem estado mutante, imprevisível ou estão indisponíveis durante o desenvolvimento BDs, servidores de aplicação, servidores Web, hardware Fonte: www.objectmentor.com, 2002 6
  • 7. Dependências de servidores Use stubs para simular serviços e dados É preciso implementar classes que devolvam as respostas esperadas para diversas situações Complexidade muito grande da dependência pode não compensar investimento (mas não deixe de fazer testes por causa disto!) Vários tipos de stubs: mock objects, self-shunts. argonavis.com.br Use proxies (mediadores) para serviços reais Oferecem interface para simular comunicação e testa a integração real do componente com seu ambiente Não é teste unitário: teste pode falhar quando código está correto (se os fatores externos falharem) Exemplo: Cactus, HttpUnit 7
  • 8. Mock Objects Mock objects (MO) é uma estratégia similar ao uso de stubs mas que não implementa nenhuma lógica Um mock object não é exatamente um stub, pois não simula o funcionamento do objeto em qualquer situação Comportamento é controlado pela classe de teste que Define comportamento esperado (valores retornados, etc.) Passa MO configurado para objeto a ser testado Chama métodos do objeto (que usam o MO) argonavis.com.br Implementações open-source que facilitam uso de MOs EasyMock (tammofreese.de/easymock/) e MockMaker (www.xpdeveloper.com) geram MOs a partir de interfaces Projeto MO (mockobjects.sourceforge.net) coleção de mock objects e utilitários para usá-los 8
  • 9. Exemplo de Mock Object public interface Dependencia { public String metodo(); } argonavis.com.br import mockmaker.ReturnValues; import com.mockobjects.*; Interface Implementação "mock" da interface gerada pelo mock maker public class MockDependencia implements Dependencia{ private ExpectationCounter metodoCalls = new ... ; private ReturnValues metodoReturnValues = new ... ; public void setExpectedMetodoCalls(int calls){ metodoCalls.setExpected(calls); métodos para } configuração do mock public void setupMetodo(boolean arg){ object e resultados metodoReturnValues.add(new Boolean(arg)); } esperados public void verify(){ metodoCalls.verify(); implementação } public boolean metodo(){ metodoCalls.inc(); Object nextReturnValue = metodoReturnValues.getNext(); return ((String) nextReturnValue).toString(); } } 9
  • 10. Usando um Mock Object Objeto que usa Dependência. Em tempo de desenvolvimento, ela será implementada por um Mock object. import junit.framework.*; public class DepClient { private Dependencia dep; public DepClient(Dependencia dep) { this.dep = dep; } public String operacao(String texto) { return dep.metodo(texto); } } argonavis.com.br public class DepClientTest extends TestCase { private DepClient client; private MockDependencia mockObject; // implements Dependencia! public void setUp() { mockObject = new MockDependencia(); client = new DepClient(mockObject); mockObject.setExpectedMetodoCalls(1); mockObject.setupMetodo("DADOS"); // define comportamento } public void testMetodo() throws java.io.IOException { String result = client.operacao("dados"); assertEquals("DADOS", result); mockObject.verify(); Test Case que usa um Mock Object } } para simular uma dependência real 10
  • 11. Como testar bancos de dados Refatore seu código para que não seja necessário usar mock objects para JDBC argonavis.com.br Forneça um DAO (Data-Access Object) que encapsule os métodos de acesso ao banco que sua aplicação irá utilizar Escreva testes para a Interface do DAO Escreva um stub para a interface do DAO ou gere um mock object para ela Outra alternativa é criar implementação de DAO que faça acesso a banco pequeno, facilmente configurável Muitas vezes é mais fácil testar no próprio sistema que escrever os stubs e mock objects 11
  • 12. Exercício 1. Gere um MockObject para testar a aplicação fornecida que depende de um DAO argonavis.com.br Use o MockMaker Escreva um test-case que utilize o mock object criado pelo mock maker. Escreva um segundo teste (no mesmo test case) que use o DAO implementado (antes de executar, rode ant create-table para criar a tabela) 12
  • 13. Fontes Documentação XDoclet. xdoclet.sourceforge.net [2] Erik Hatcher. Java Development with Ant. Manning, 2003 [3] Eric Burke & Brian Coyner. Java eXtreme Programming Cookbook. O'Reilly, 2003 argonavis.com.br [1] 13
  • 14. Curso J820 Produtividade e Qualidade em Java: Ferramentas e Metodologias Revisão 1.1 © 2002, 2003, Helder da Rocha (helder@acm.org) argonavis.com.br