Mock Objects
-
Author
elliando-dias -
Category
Technology
-
view
1.595 -
download
0
Embed Size (px)
description
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