Mock Objects

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    Favorites, Groups & Events

    Mock Objects - Presentation Transcript

    1. TQS - Teste e Qualidade de Software ( Software Testing and Quality ) Mock Objects João Pascoal Faria [email_address] www.fe.up.pt / ~jpf (baseado em slides de ex-alunos)
    2. Índice
      • Definição
      • Quando usar
      • Detalhes técnicos
      • Exemplo prático
      • Frameworks
      • Exemplo com jMock 2
    3. Definição
      • Objectos simulados que imitam o comportamento de objectos reais de um modo controlado [wikipedia]
      • Criam-se para fazer testes ao comportamento de outros objectos
        • Tal como os crash test dummies são usados nos testes de automóveis
    4. Quando usar
      • Quando o objecto real...
        • ainda não existe
        • retorna um resultado não determinístico
          • Hora Actual, Temperatura Actual
        • tem estados difíceis de atingir
          • um erro da rede
        • precisa de incluir informação e métodos exclusivamente para uso nos testes e não para a sua tarefa
        • é lento
          • uma base de dados completa que tenha que ser inicializada antes do teste
    5. Detalhes técnicos
      • Permitir que o objecto que o invoca não saiba se está a usar um objecto real ou um mock object
      • Têm a mesma interface que os objectos que simulam
        • Ambos implementam a mesma interface
        • Mock object estende objecto real
    6. Exemplo prático
      • public class Convert {
        • public static double getTemperatureInCelcius(City city){
          • double tempF;
          • Sensor sensor = city.getSensor();
          • tempF = sensor.getCurrentTemperature();
          • //Convert Fahreneit to Celsius degrees
          • return (tempF-32.0)*(5.0/9.0);
        • }
      • }
      Resultado não determinístico Classe City não existe
    7. Exemplo prático (continuação)
      • public class Convert {
        • public static double getTemperatureInCelcius(City city){
        • double tempF;
        • Sensor sensor = city.getSensor();
        • tempF = sensor.getCurrentTemperature();
        • return (tempF-32.0)*(5.0/9.0);
        • }
      • }
      • public class MockSensor extends Sensor {
        • public double getCurrentTemperature() {
          • //MOCK
          • return 72.5;
        • }
      • }
      Resultado conhecido (=22.5ºC)
    8. Exemplo prático (continuação)
      • public class Convert {
        • public static double getTemperatureInCelcius(City city){
        • double tempF;
        • Sensor sensor = city.getSensor();
        • tempF = sensor.getCurrentTemperature();
        • return (tempF-32.0)*(5.0/9.0);
        • }
      • }
      Escrever método para controlar valor de retorno
      • public class MockCity implements City {
        • private Sensor curSensor ;
        • public Sensor getSensor() {
          • //MOCK
          • return curSensor ;
        • }
        • public void setSensor(Sensor s){
        • //MOCK
        • this . curSensor = s;
        • }
      • }
    9. Exemplo prático (continuação)
      • public class TestConvert extends TestCase {
        • public void testGetTemperatureInCelcius() {
          • MockCity city = new MockCity();
          • MockSensor sensor = new MockSensor();
          • city.setSensor(sensor);
          • assertEquals (22.5, Convert. getTemperatureInCelcius (city));
        • }
      • }
    10. Em suma…
      • Escrever classes mock
      • Estender classe real
      • Implementar interface
        • Implementar todos os seus métodos
      • Reescrever ( overwrite ) os métodos a simular
      • Criar e executar teste
    11. Frameworks
      • Facilitam e tornam mais rápida a criação dos Mock Objects
        • Não é necessário escrever o código das classes mock
      • Permitem criaç ão a partir de:
        • Interfaces
        • Classes
      • Permitem definir expectativas flexíveis
        • Número de chamadas a métodos
        • Valores de retorno
        • Valores dos parâmetros
        • Lançamento de excepç ões
      • Integram com JUnit (Java), NUnit (.Net), etc.
      • Fornecem normalmente APIs extens íveis
    12. Frameworks
      • Java
        • jMock ( http://www.jmock.org )
        • EasyMock ( http://www.easymock.org )
        • rMock ( http://rmock.sourceforge.net )
        • MockCreator ( http://mockcreator.sourceforge.net )
        • MockLib ( http://mocklib.sourceforge.net )
      • C#
        • MockLib ( http://sourceforge.net/projects/mocklib )
        • Rhino Mocks ( http://www.ayende.com /)
        • NMock ( http://nmock.org )
    13. Frameworks
      • Ruby
        • Mocha ( http://mocha.rubyforge.org )
        • RSpec ( http://rspec.rubyforge.org )
        • FlexMock ( http://onestepback.org/software/flexmock )
      • Outras linguagens
        • C++
        • Javascript
        • Perl
        • Python
        • ActionScript
    14. Exemplo com jMock 2 – código a testar
      • public class Convert {
        • public static double getTemperatureInCelcius(City city){
          • double tempF;
          • Sensor sensor = city.getSensor();
          • tempF = sensor.getCurrentTemperature();
          • //Convert Fahreneit to Celsius degrees
          • return (tempF-32.0)*(5.0/9.0);
        • }
      • }
      Resultado não determinístico Classe City não existe public interface City { Sensor getSensor(); } // Nesta versão de jMock só faz "mocks" de interfaces public interface Sensor { double getCurrentTemperature();} Não implementados!
    15. Exemplo com jMock 2 – código de teste import org.jmock.integration.junit3.MockObjectTestCase; import org.jmock.Expectations; public class JMockTestConvert extends MockObjectTestCase { // set up final City mockCity = mock(City. class ) ; final Sensor mockSensor = mock(Sensor. class ); public void testGetTemperatureInCelcius() { // expectations checking( new Expectations() {{ one( mockCity ).getSensor(); will(returnValue( mockSensor )); one( mockSensor ).getCurrentTemperature(); will(returnValue(72.5)) ; }}); // execute double result = Convert. getTemperatureInCelcius ( mockCity ); // test assertEquals (22.5, result); } }
    16. Exercício
      • Com base na rotina de conversão de um número para extenso (ver “Extensos.java”), desenvolver (segundo a abordagem TDD) na mesma classe Extensos uma método estático MoneyExt(double m, Currency c) para converter um valor monetário m para extenso em maiúsculas. O 2º argumento é uma instância de uma interface que define métodos para obter a designação por extenso da unidade monetária e fracções no singular e plural (exemplo: euro, euros, cêntimo, cêntimos), bem como o número de dígitos a usar na parte fraccionária (exemplo: 2), de acordo com a seguinte sintaxe (em Java usar String em vez de string): public interface Currency { string getCurrencyNamePlural(); string getCurrencyNameSingular(); string getFractionsNameSingular(); string getFractionsNamePlural(); int getFractionsDigits(); } Criar uma mock class MockCurrency que implementa a interface Currency só para efeitos de teste.
      • Repetir usando um framework como o jMock, em vez de criar uma mock class
    17. Referências e mais informação
      • www.jmock.org
      • www.mockobjects.com

    + adorepumpadorepump, 11 months ago

    custom

    358 views, 0 favs, 0 embeds more stats

    TQS - Teste e Qualidade de Software (Software Testi more

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 358
      • 358 on SlideShare
      • 0 from embeds
    • Comments 0
    • Favorites 0
    • Downloads 12
    Most viewed embeds

    more

    All embeds

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories