Componentes de Teste Últ. Atualiz.: set/2010.

Slides:



Advertisements
Apresentações semelhantes
Behaviour-Driven Development em Ruby
Advertisements

Desenvolvimento de Plug-ins Orientado a Testes
INF321 Fases de Testes.
INF 321 Avaliação dos testes.
Programação em Java Prof. Maurício Braga
Paulo Marques Hernâni Pedroso
Padrão de Projeto Interpreter
Orientação a Objetos: Encapsulamento e Classificação
Desenvolvimento Guiado por Testes
Walfredo Cirne walfredo.dsc.ufpb.br
Walfredo Cirne walfredo.dsc.ufpb.br
Polimorfismo e Classes Abstratas Profa
PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001
Tutorial I: Criando a interface de uma aplicação em Java
Classes e objetos Arrays e Sobrecarga
Classes e objetos P. O. O. Prof. Grace.
Estrutura de Dados em Java
Paradigmas de Linguagens de Programação Paradima da Programação Orientada à Objetos Professor: Armando Hage Belém-2008.
Linguagem Técnica II Testes Automatizados Aula 04 Prof
© Nabor C. Mendonça Análise e Projeto Orientados a Objeto com UML e Padrões Parte V Implementação (1)
Programação Orientada a Objetos com Java
Universidade de São Paulo Instituto de Ciências Matemáticas e de Computação Departamento de Computação e Estatística Servidor de Documentos XML Usando.
Plano de teste.
Web Services Uninorte Semana de Tecnologia da Informação
Banco de Dados de Objetos
Chamada Remota de Procedimentos
Utilizando Testes Unitários Gleibson Rodrigo “dartanham” Fontes: antiga apresentação de testes da disciplina de ESS e na curso de testes do PDesigner.
Desenvolvimento de Aplicações CORBA
JUnit “Keep the bar green to keep the code clean” JUnit Site.
Estudo de Caso: um editor de documentos
Um Framework Para Testes
Concorrência e Java RMI
How to Break Software Capítulo 2 Taíse Dias Testing from the User Interface.
Paulo Borba Centro de Informática Universidade Federal de Pernambuco Classes Abstratas e Interfaces.
Testes de Unidade Usando JUnit
Introdução – Teste de Unidade usando JUnit
1 Test Driven Development John Jonathan da Silva /
Paulo Borba Centro de Informática Universidade Federal de Pernambuco
T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI.
Pilhas Profa. Nádia Félix.
Concorrência e thread Petrônio Júnior(pglj) Márcio Neves(mmn2)
Configuração do Ambiente de programação
Implementação MVC Pedro Antonino.
Orientação a Objetos usando Java
Java Kickstart, day 2 Semelhanças com linguagem C.
Aula Prática 4 Monitoria IP/CC (~if669).
Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota (com material da Qualiti Software Process)
Coleções, Genéricos, Threads Marco Antonio. Collection Principais métodos da interface Collection.
1 Marcio de Carvalho Victorino JAVA. 2 Declaração de Atributos [ ] [transient] [volatile] [static] [final] ; controle de acesso –public, package (default),
Classes Abstratas e Interface
Certificação Marco Antonio. Introdução A compreensão desse capítulo é muito importante pois trata de um assunto essencial em qualquer linguagem de programação,
Execução de testes: driver e stub
RMI Objetos Distribuídos Luiz C. D´oleron SCJP
Coleções em Java - Parte 2
Aglets.
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
Socket em Java.
Daniel Cukier – IME - USP 1 Junit 4.0 Daniel Cukier – IME – USP MAC5700.
Modificadores Programação II.
1 JUnit. 2 Por que testar? Qualidade: Código testado é mais confiável –Como saber se o recurso funciona sem testar? Coragem para mudar: o programador.
Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota
J U nit Um Framework Para Testes. Motivação  Todos os programadores sabem que devem testar seu código  Quanto mais curto o prazo menos testes são realizados.
RMI Java Remote Method Invocation em Java. Introdução Java Remote Method Invocation (Java RMI) permite desenvolver sistemas distribuídos baseados em Java.
CURSO JAVA BÁSICO Módulo 9 – slide 1 Módulo 10 Threads.
SOCKET - É um canal de comunicação entre processos que estabelece uma conexão entre eles na forma de cliente-servidor. Por meio de sockets, os computadores.
Testes de Unidade. 2 Pauta Testes de Unidade; Testes de Unidade; Desenvolvimento orientado a testes; Desenvolvimento orientado a testes; Testes unitários.
Strings e Arrays Prof. Gustavo Wagner (Alterações) Prof. Tiago Massoni (Slides Originais) Desenvolvimento de Sistemas FATEC-PB  Centro de Informática,
Laboratório de Computação Aula 06 e 07 – Implementação de classes Prof. Fábio Dias
Herança e Polimorfismo Prof. Gustavo Wagner (Alterações) Prof. Tiago Massoni (Slides Originais) Desenvolvimento de Sistemas FATEC-PB  Centro de Informática,
Linguagem de Programação – Aula 04 Prof. Me. Ronnison Reges Vidal.
Transcrição da apresentação:

Componentes de Teste Últ. Atualiz.: set/2010

Tópicos Noção de drivers, stubs e mock objects Estrutura da implementação de um caso de teste Padrões para construção de stubs e mocks Componentes de Teste

Referências R.Binder. Testing OO Systems. Addison Wesley, 1999, c.16-19. Onde encontrar tutoriais sobre JUnit: http://open.ncsu.edu/se/tutorials/junit/ www.cs.uoregon.edu/education/classes/05S/cis410sm/lecture-slides/JUnitTutorial.ppt www.cs.wm.edu/~noonan/cs301/labs/junit/tutorial.html supportweb.cs.bham.ac.uk/documentation/tutorials/docsystem/build/tutorials/junit/junit.pdf ... Componentes de Teste

Mais referências Vincent Massol e Ted Husted. Junit in Action, cap7. Manning Publications, 2003. Martin Fowler. “Mocks aren't stubs”. Atualizado em jul/2004 no seguinte endereço: /www.martinfowler.com/articles/mocksArentStubs.html Sobre padrões para definir mocks: G. Meszaros. : A Pattern Language for Automated Testing of Indirect Inputs and Outputs using XUnit. PLOP 2004. Obtained in jan/2006 at: http://testautomationpatterns.com/TestingIndirectIO.html S. Gorts. Unit testing with hand crafted mocks. Last updated on sept/2004. Obtained at: http://refactoring.be. Setembro/2001 Qualidade_V&V Componentes de Teste 4

Componentes de teste (1) Driver Programa ou classe que aplica os casos de teste ao componente em teste Faz o papel de cliente do componente em teste (CeT). Stub Implementação temporária, mínima, de um componente usado pelo CeT, com o objetivo de melhorar a controlabilidade e observabilidade do CeT durante os testes. Faz o papel de servidor do CeT. Test Harness Sistema que compreende os drivers, stubs, CeT e outras ferramentas de apoio aos testes. Componentes de Teste

Componentes de testes (2) Driver Cliente Casos de teste Resul tados Implementação Implementação em Teste Servidor 1 Servidor 2 Servidor 3 Stub 1 Stub 2 Stub 3 Componentes de Teste

Componentes de testes (3) Devem ser mais simples e mais rápidos de desenvolver do que as unidades substituídas Grau de facilidade ou dificuldade de construí-los depende da qualidade do projeto: acoplamento  coesão   dificuldade  Componentes de Teste

Exemplo Tabela CriarTabela( ) LerItem( ) InserirItem( ) RemoverItem( ) MostrarTabela( ) Tabela Componentes de Teste

Exemplo - Driver Tabela Driver type TabInt = array [ 1 .. N, 1 .. M ] of integer; ... var Tabela: TabInt, x: integer; criaTab ; leItem ( x ); insereItem (x ); mostraTab ; .... CriarTabela( ) LerItem( ) InserirItem( ) RemoverItem( ) MostrarTabela( ) Driver Tabela Componentes de Teste

Tabela Ordena_Vetor( ) Componentes de Teste

Exemplo: stub Tabela Stub type VetorInt = array [1 .. N] of integer; ... procedure Ordena_Vetor (a : VetorInt); begin write (“Valores fornecidos”); for i := 1 to N do write (a [ i ] ); write (“Forneça os valores ordenados”); for i := 1 to N do read (a [ i ] ); end; Stub Componentes de Teste

Como testar unidades Uma sugestão de passos para os testes : Se a unidade usa a outras, que ainda não estão completas ou que não serão testadas em conjunto, crie stubs. Crie um ou mais drivers para a unidade, o que inclui: Construção de casos de teste e dos dados para cada caso de teste. Determine o oráculo para caso de teste. Execute a unidade, usando os casos de teste. Provisione os resultados obtidos: exibição na tela ou armazenamento em um log. Componentes de Teste

Estrutura de testes (xUnit) Servi- dores caso de teste Stub cria Prepara (set up) Executa Verifica Termina (clean up) configura instala CeT Componentes de Teste

Fases da execução de um caso de teste Preparação (set up): Cria o que for necessário, configurando os stubs de acordo para que o caso de teste execute conforme o esperado. Execução: Interage com o CeT, aplicando os testes gerados e observando os resultados obtidos. Verificação: Compara os resultados obtidos com os esperados. Término (clean up ou tear down): Termina a execução do CeT e deixa o ambiente de execução de testes no mesmo estado em que estava antes da realização do caso de teste. Componentes de Teste

Mock Objects Criados pela comunidade XP (em 2000) Objetivo: Tim Mackinnon, Steve Freeman, Philip Craig. “Endo-Testing: Unit Testing with Mock Objects” (www.cs.ualberta.ca/~hoover/cmput401/XP-Notes/xp-conf/Papers/4_4_MacKinnon.pdf), apresentada no evento XP2000.(disponível emt www.mockobjects.com). Objetivo: Sistematizar a geração de stubs Desenvolver uma infra-estrutura para criação de mocks e incorporação dos mesmos aos Testes de Unidade. Componentes de Teste

Bibliotecas Mock Objects (ou mocks) servem para emular ou instrumentar o contexto (serviços requeridos) de objetos da CeT. Devem ser simples de implementar e não duplicar a implementação do código real. Bibliotecas de mocks podem ser usadas para criar stubs: existem várias APIs para esse fim: MockObjects (www.mockobjects.com) EasyMock (www.easymock.com) MockMaker (www.mockmaker.org ) djUnit (http://works.dgic.co.jp/djunit/) ... Componentes de Teste

Porquê criar mocks Adiar decisão sobre a plataforma a ser usada Esta é uma outra diferença entre mocks e stubs  poder criar uma classe que tenha o comportamento esperado, sem se comprometer com nenhuma plataforma específica. Ex.: para testar acesso a BD, cria-se um mock com a funcionalidade mínima que se espera do BD, sem precisar usar um BD específico. Lidar com objetos difíceis de inicializar na fase de preparação (set up) Testes de unidade que dependam de um estado do sistema que é difícil de preparar, especialmente quando ainda não se tem o resto do sistema, podem usar mocks. O mock emula o estado de sistema, sem a complexidade do estado real. Dessa forma, o mock poderia ser utilizado por vários casos de teste que necessitem que o sistema esteja neste estado. Testar o objeto em condições difíceis de serem reproduzidas Por exemplo, para os testes em presença de falhas do servidor: o mock pode implementar um proxy do servidor, que apresente um defeito pré-estabelecido quando for usado em determinados casos de teste. - Adiar decisão sobre a plataforma a ser usada: ex.: we might wish to write functionality without committing to a particular database. Until a choice is made, we can write a mock class that provides the minimum behaviour that we would expect from our database. This means that we can continue writing the tests for our application code without waiting for a working database. The mock code also gives us an initial definition of the functionality we will require from the database. Lidar com objetos difíceis de inicializar unit test that depends on complex system state can be difficult to set up, especially as the rest of the system develops. Mock Objects avoid such problems by providing a lightweight emulation of the required system state. Furthermore, the setup of complex state is localised to one Mock Object instead of scattered throughout many unit tests. Testar o objeto em condições difíceis de serem reproduzidas For example, to test server failures we can write a Mock Object that implements the local proxy for the server. Each unit test can then configure the proxy to fail with an expected problem and the developers can write client code to make the test pass. Componentes de Teste

Mocks x stubs Mocks são voltados para testes classes. Stubs, em princípio, podem ser usados em qqr linguagem (OO ou não). Segundo Martin Fowler, mocks e stubs não são sinônimos: Mocks podem servir para colocar o objeto da CeT no estado desejado para os testes. Um stub é uma implementação alternativa da interface do objeto substituído. Um stub é mais passivo, geralmente retornando dados pré-estabelecidos pelos casos de teste para a CeT. Mocks podem verificar se o servidor foi chamado adequadamente  contêm verificação embutida (assertivas) Componentes de Teste

Exemplo: classe em teste e uma servidora classe ClasseEmTeste Servidora serv; metodo( ) serv.executa( ) end classe Servidora executa( ) # código complexo http://www.floehopper.org/articles/2006/09/11/the-difference-between-mocks-and-stubs Componentes de Teste

Exemplo de stub: pseudo-código classe ClasseDeTeste implementa Test::Unit::TestCase classe ServidoraStub executa( ) retorna X end // exemplo_uso_Stub ServidoraStub servidora classeTeste = ClasseEmTeste.new(servidora) assert_equal X, classeTeste.metodo http://www.floehopper.org/articles/2006/09/11/the-difference-between-mocks-and-stubs Componentes de Teste

Exemplo de mock: pseudo-código classe ClasseDeTeste implementa Test::Unit::TestCase classe ServidoraMock atributo: call_count ... call_count = 0 // métodos execute( ) call_count +=1 end get_call_count ( ) // exemplo_uso_Mock servidora = ServidoraMock.new classeTeste = ClasseEmTeste.new(servidora) assert_equal 1, servidora.get_call_count http://www.floehopper.org/articles/2006/09/11/the-difference-between-mocks-and-stubs Componentes de Teste

Outro exemplo : o mock Interface da classe substituída // Usado no teste do método: canUserLogin( User, String ) , para substituir // o método validatePassword, chamado pelo método em teste. public class MockUser implements User { ... // Prepara o que retornar quando validatePassword for chamado public void setValidatePasswordResult( boolean result ) { expectedCalls++; this.returnResult = result; } // Implementação do mock de validatePassword public boolean validatePassword( String password ) { actualCalls++; return returnResult; } public boolean verify() { return expectedCalls == actualCalls; } ... } Interface da classe substituída Determina nº esperado de chamadas ao método substituído Conta chamadas ao método substituído Verifica se chamadas de acordo com o esperado Componentes de Teste

Outro exemplo: o caso de teste // Caso de teste usando o MockUser criado anteriormente public void testCanUserLogin() { MockUser user = new MockUser(); user.setValidatePasswordResult( true ); boolean result = um.canUserLogin( user, "foobar" ); assertTrue("Expected to validate user " + "password \"foobar\"", result ); assertTrue("MockUser not used as expected", user.verify(); } preparação execução verificação Componentes de Teste

Padrões G. Meszaros definiu diversos padrões de projeto para mocks. S.Gorst definiu vários idiomas (padrões de código) para serem usados em stubs. Entre eles: Responder: Usado para fornecer entradas válidas para o CeT. Saboteur: Usados para fornecer entradas inválidas ou lançar exceções para o CeT. Componentes de Teste

Responder Problema: como fazer para que um objeto da CeT receba valores esperados de um servidor durante os testes. Solução: uso de uma classe que pode ser configurada para responder com um objeto Responder a cada chamada de método. Componentes de Teste

Responder Implementa mesma interface da classe servidora import java.util.ArrayList; import java.util.List; public class ResponderCommunicator implements Communicator { private List _responses = new ArrayList( ); public void open( ) throws CommunicationException { } public void close( ) throws CommunicationException { } public String communicate(String message) throws CommunicationException { if ( !_responses.isEmpty( ) ) return (String)_responses.remove(0); throw new CommunicationException("use setResponse to define responses"); } public void setResponse(String response) { _responses.add(response); } } Responder Implementa mesma interface da classe servidora Contém lista de respostas a serem fornecidas a cada chamada da classe servidora Verifica a cada chamada, se a lista de respostas =   lança exceção Método que configura a lista de respostas Componentes de Teste

Saboteur Problema: como exercitar o comportamento do CeT em situações de erro. Solução: uso de um sabotador, i.e, mock que retorne condições de erro. Componentes de Teste

Saboteur Flags que indicam se é para retornar erro ou não public class SaboteurCommunicator implements Communicator { private boolean _openIsSabotaged; private boolean _closeIsSabotaged; private boolean _communicateIsSabotaged; public void open( ) throws CommunicationException { if ( _openIsSabotaged ) throw new CommunicationException("open( ) sabotaged"); } public String communicate(String message) throws CommunicationException { if ( _communicateIsSabotaged ) throw new CommunicationException("communicate( ) sabotaged"); return null; } public void close( ) throws CommunicationException { if ( _closeIsSabotaged ) throw new CommunicationException("close( ) sabotaged"); } public void sabotageOpen( ) { _openIsSabotaged = true; } public void sabotageClose( ) { _closeIsSabotaged = true; } public void sabotageCommunicate( ) { _communicateIsSabotaged = true; } } Saboteur Flags que indicam se é para retornar erro ou não A cada chamada, verifica o flag. Se true, lança exceção. Métodos usados pelos casos de teste para inicializar os flags. Componentes de Teste

Principais pontos aprendidos Setembro/2001 Qualidade_V&V Componentes de Teste 29

Padrões Diversos autores propuseram padrões para a implementação de componentes de testes: Drivers Stubs Os padrões mostrados aqui são para sw OO, mas a criação de drivers e stubs também é necessária em outros paradigmas. Componentes de Teste

Driver (1) Classe em teste (CeT) Classe Driver +casoTeste001( ) Pode ser: - parâmetro dos casos de teste - atributo do Driver - variável local de cada caso de teste Classe Driver +casoTeste001( ) +casoTeste002( ) ... Cada caso de teste = método da classe driver o driver pode conter um número arbitrário de métodos Componentes de Teste

Driver (2) ... TestCase CeT Driver CaseTeste001 CaseTeste002 Contém instâncias dos casos de teste; contém instância da classe em teste (CeT); pode herdar de uma classe abstrata (ex.: TestSuite, do JUnit) CaseTeste002 CaseTeste003 ... Componentes de Teste

Driver (3) CeT Driver Driver é subclasse da CeT Facilita acesso a características não-privadas da CeT; Útil para testar classes abstratas, implementando métodos virtuais Componentes de Teste

Driver (4) CeT InterfacedeTeste +Cet_método01( ) +CeTmétodo02( ) -casoTeste_método01( ):bool -casoTeste_método02( ):bool -casoTeste_interaçãoMétodos( ):bool ... Driver Driver embutido na CeT Componentes de Teste

Stubs Substituem objetos com os quais os objetos da classe em teste (CeT) interagem. Não contêm lógica: só métodos que podem ser usados pelos casos de teste para controlar o comportamento do objeto substituído. Quando usar [Massol e Husted 2003] : Quando o comportamento do objeto substituído não é determinístico Quando é difícil preparar o objeto sendo substituído. Quando é difícil forçar um determinado comportamento (em especial, exceções) no objeto substituído. Quando o objeto substituído tem uma interface gráfica. Quando o objeto substituído é lento. O caso de teste precisa obter informações do tipo: o método X foi chamado no objeto substituído? O objeto substituído ainda não foi implementado. Componentes de Teste

Stubs (1) Classe Servidora (CS) Interface_CS Stub CeT (cliente) Retorna sem executar nada; Retorna valor constante; Retorna contagem do nro de chamadas; Retorna valor que varia conforme o nro de chamadas ao stub; Retorna valores mínimo e máximo dos parâmetros enviados ao stub; Retorna valores lidos de arquivo, banco de dados ou outra estrutura de dados; Registra execução em arquivo de log; Simula exceções; ... implementa Stub CeT (cliente) Componentes de Teste

Stubs (2) Classe Servidora (CS) Interface_CS Stub CeT (cliente) implementa Funciona como um intermediário (proxy) entre a CeT e a CS. Delega mensagens da CeT para a CS. Serve para testar tanto o cliente (simula ou altera respostas do servidor para o cliente) quanto o servidor (simula ou altera mensagens do cliente para o servidor). Stub delega mensagens para CeT (cliente) Componentes de Teste

Executando testes com JUnit Classe fundamental para criação de teste de unidade: TestCase  parte da biblioteca junit.jar (necessária no classpath). Convenção de nomes: Para a classe de teste: <nome da CeT>Test.java Para os métodos da classe de teste: test<nome do método em teste> TestSuite: Coleção de TestCases Nome default (Eclipse): AllTests.java Fixture: Contexto necessário para os testes (ex.: stubs) Componentes de Teste

Executando testes com JUnit Passos: Crie os casos de teste para a classe Adequado para testar cada método isoladamente Crie uma subclasse da classe TestCase. Adicione variáveis de instância (atributos) para serem utilizados nos testes (correspondem à CeT). Crie um construtor que aceita uma cadeia de caracteres como parâmetro e passe-o para a superclasse. Reescreva o método setUp(). Reescreva o método tearDown(). Componentes de Teste

Cria subclasse de TestCase import junit.framework.TestCase; import Calculadora; public class CalculadoraTest extends TestCase { private Calculadora calc_div; private Calculadora calc_mult; public TestCalc(String arg0) { super(arg0); protected void setup(){ calc_div = new Calculadora(); calc_mult = new Calculadora (); } protected void teardown(){ calc_div = null; calc_mult = null; ... Cria subclasse de TestCase Declara objetos da CeT como atributos Cria construtor especial Prepara configuração de testes (fixture): cria objetos em teste Fecha configuração de testes Componentes de Teste

Criação de casos de teste Crie um método para cada caso de teste Incluir o método TestRunner.run( ) no main para invocar os métodos de teste Utilize assertivas (Assert) para comparar os resultados obtidos com os esperados (oráculo) Componentes de Teste

Cria casos de teste chama run( ) para executar os testes ... public static void main(String[] args) { junit.textui.TestRunner.run(CalculadoraTest.class); public void testDivisao() { float resultado; resultado = calc_div.divisao(1.0/5.0); assertEquals(resultado, 0.2); } chama run( ) para executar os testes Compara com resultado esperado Componentes de Teste

Mais um exemplo contém persiste BD manipula manipula ServConta ... transfere ( ) ControleConta ... buscaConta (id) atualiza ( ) contém persiste BD manipula manipula Conta debite (qt) credite (qt) saldo ( ) Como testar ServConta sozinha, sem precisar criar o BD? ==> uso de mock [Massol e Husted 2003] Componentes de Teste

Mock que implementa a interface de ControleConta Classe em teste Mock que implementa a interface de ControleConta import java.util.Hashtable; public class MockControleConta implements ControleConta { // estrutura que “simula” o BD de Contas private Hashtable contas = new Hastable ( ); //define o que buscaConta deve retornar public void criaConta (String cliente, Conta cc) { this.contas.put (cliente, cc); } public Conta buscaConta (String cliente) { return (Conta) this.contas.get (cliente); } // não retorna nada, como se término normal public void atualiza (Conta cc) { // não faz nada } } public class ServConta { private ControleConta cConta; public void setControleConta (ControleConta controlador) { this.cConta = controlador; } public void transfere(String de, String para, long qtia) { Conta deConta = this.cConta.buscaConta (de); Conta paraConta = this.cConta.buscaConta (para); deConta.debite(qtia); paraConta.credite(qtia); this.cConta.atualiza (deConta); this.cConta.atualiza(paraConta); } } Componentes de Teste

Prepara Aplica o teste Verifica o resultado  Caso de teste import junit.framewrok.TestCase; public class TestServConta extends TestCase { public void testTransfereOK ( ) MockControleConta mockCConta = new MockControleConta ( ); Conta deCliente = new Conta (“MarcusValério”, 300000000); Conta paraCliente = new Conta (“Eliane”, -200); mockCConta.criaConta (“1”, deCliente); mockCConta.criaConta (“2”, paraCliente); ServConta servTransfer = new ServConta ( ); servTransfer.setControleConta (mockCConta); servTransfer.transfere (“1”, “2”, 500); assertEquals (300000000-500, deCliente.saldo ( )); assertEquals (-200+500, paraCliente.saldo ( )); }  Caso de teste Prepara Cria instâncias de Conta Inicializa tabela hash do mock Instancia classe em teste e estabelece objeto mock como servidor Aplica o teste A tabela hash do mock faz as vezes do BD de contas Verifica o resultado Componentes de Teste

Exemplo de uso com conexões http Cliente Web Servidor Web public String getContent (URL url) { ... url.openConnection ( ); .... } recurso public void doGet ( ...) { // obtém o HTML } Conexão http Componentes de Teste

Exemplo de uso com conexões http Cliente Web (em teste) Mock public String getContent (URL url) { ... mockUrl.openConnection ( ); .... } public MockUrl { } public void openConnection ( ...) { // lógica do mock } Envia mensagem para o mock 2. substitui url ==> mockUrl 3. executa o teste public TestaClienteWeb extends TestCase { ... public void testGetContent ( ) // preparação: 1, 2 e 3 } Uso de padrões pode melhorar essa estrutura, sem precisar alterar a classe em teste. 1. cria mock e configura seu comportamento Componentes de Teste