Mock Objects

of 17 /17
1 Mock objects, João Pascoal Faria, 2007 TQS - Teste e Qualidade de Software (Software Testing and Quality) Mock Objects João Pascoal Faria [email protected] www.fe.up.pt/~jpf (baseado em slides de ex-alunos)

Embed Size (px)

description

TQS - Teste e Qualidade de Software (Software Testing and Quality)

Transcript of Mock Objects

  • 1. TQS -Teste e Qualidade de Software ( Software Testing and Quality ) Mock Objects Joo Pascoal Faria [email_address] www.fe.up.pt / ~jpf (baseado em slides de ex-alunos)

2. ndice

  • Definio
  • Quando usar
  • Detalhes tcnicos
  • Exemplo prtico
  • Frameworks
  • Exemplo com jMock 2

3. Definio

  • Objectos simulados que imitam o comportamento de objectos reais de um modo controlado [wikipedia]
  • Criam-se para fazer testes ao comportamento de outrosobjectos
    • Tal como oscrash test dummiessousados nos testes de automveis

4. Quando usar

  • Quando o objecto real...
    • ainda no existe
    • retorna um resultado no determinstico
      • Hora Actual, Temperatura Actual
    • tem estados difceis de atingir
      • um erro da rede
    • precisa de incluir informao e mtodos exclusivamente para uso nos testes e no para a sua tarefa
    • lento
      • uma base de dados completa que tenha que ser inicializada antes do teste

5. Detalhes tcnicos

  • Permitir que o objecto que o invoca no saiba se est a usar um objecto real ou ummock object
  • Tm a mesma interface que os objectos que simulam
    • Ambos implementam a mesma interface
    • Mock objectestende objecto real

6. Exemplo prtico

  • public classConvert {
    • public static doublegetTemperatureInCelcius(City city){
      • doubletempF;
      • Sensor sensor = city.getSensor();
      • tempF = sensor.getCurrentTemperature();
      • //Convert Fahreneit to Celsius degrees
      • return(tempF-32.0)*(5.0/9.0);
    • }
  • }

Resultado no determinstico Classe City no existe 7. Exemplo prtico (continuao)

  • public classConvert {
    • public static doublegetTemperatureInCelcius(City city){
    • doubletempF;
    • Sensor sensor = city.getSensor();
    • tempF = sensor.getCurrentTemperature();
    • return(tempF-32.0)*(5.0/9.0);
    • }
  • }
  • public classMockSensorextendsSensor {
    • public doublegetCurrentTemperature() {
      • //MOCK
      • return72.5;
    • }
  • }

Resultado conhecido (=22.5C) 8. Exemplo prtico (continuao)

  • public classConvert {
    • public static doublegetTemperatureInCelcius(City city){
    • doubletempF;
    • Sensor sensor = city.getSensor();
    • tempF = sensor.getCurrentTemperature();
    • return(tempF-32.0)*(5.0/9.0);
    • }
  • }

Escrever mtodo para controlar valor de retorno

  • public classMockCityimplementsCity {
    • privateSensorcurSensor ;
    • publicSensor getSensor() {
      • //MOCK
      • return curSensor ;
    • }
    • public voidsetSensor(Sensor s){
    • //MOCK
    • this . curSensor= s;
    • }
  • }

9. Exemplo prtico (continuao)

  • public classTestConvertextendsTestCase {
    • public voidtestGetTemperatureInCelcius() {
      • MockCity city =newMockCity();
      • MockSensor sensor =newMockSensor();
      • city.setSensor(sensor);
      • assertEquals (22.5, Convert. getTemperatureInCelcius (city));
    • }
  • }

10. Em suma

  • Escrever classesmock
  • Estender classe real
  • Implementar interface
    • Implementar todos os seus mtodos
  • Reescrever ( overwrite ) os mtodos a simular
  • Criar e executar teste

11. Frameworks

  • Facilitam e tornam mais rpida a criao dos Mock Objects
    • No necessrio escrever o cdigo das classes mock
  • Permitem cria o a partir de:
    • Interfaces
    • Classes
  • Permitem definir expectativas flexveis
    • Nmero de chamadas a mtodos
    • Valores de retorno
    • Valores dos parmetros
    • Lanamento 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 cdigo a testar

  • public classConvert {
    • public static doublegetTemperatureInCelcius(City city){
      • doubletempF;
      • Sensor sensor = city.getSensor();
      • tempF = sensor.getCurrentTemperature();
      • //Convert Fahreneit to Celsius degrees
      • return(tempF-32.0)*(5.0/9.0);
    • }
  • }

Resultado no determinstico Classe City no existe public interfaceCity { Sensor getSensor(); } // Nesta verso de jMock s faz "mocks" de interfaces public interfaceSensor { doublegetCurrentTemperature();} No implementados! 15. Exemplo com jMock 2 cdigo de teste importorg.jmock.integration.junit3.MockObjectTestCase; importorg.jmock.Expectations; public classJMockTestConvertextendsMockObjectTestCase { // set up finalCitymockCity=mock(City. class ) ; finalSensormockSensor=mock(Sensor. class ); public voidtestGetTemperatureInCelcius() { // expectations checking( newExpectations() {{ one( mockCity ).getSensor(); will(returnValue( mockSensor )); one( mockSensor ).getCurrentTemperature(); will(returnValue(72.5)) ; }}); // execute doubleresult = Convert. getTemperatureInCelcius ( mockCity ); // test assertEquals (22.5, result); } } 16. Exerccio

  • Com base na rotina de converso de um nmero para extenso (ver Extensos.java), desenvolver (segundo a abordagem TDD) na mesma classeExtensosuma mtodo estticoMoneyExt(double m, Currency c)para converter um valor monetriompara extenso em maisculas.O 2 argumento uma instncia de uma interface que define mtodos para obter a designao por extenso da unidade monetria e fraces no singular e plural (exemplo: euro, euros, cntimo, cntimos), bem como o nmero de dgitos a usar na parte fraccionria (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 umamock class MockCurrencyque implementa a interfaceCurrencys para efeitos de teste.
  • Repetir usando umframeworkcomo o jMock, em vez de criar umamock class

17. Referncias e mais informao

  • www.jmock.org
  • www.mockobjects.com