Virtual Methods x Static Methods - Mock

14 views
Skip to first unread message

Rafael Colucci

unread,
Aug 20, 2010, 2:05:13 PM8/20/10
to Emballo
Hi there!

Ive just downloaded Emballo and I am using it as a mock framework. Its
just amazing, but ...
To mock an object, is it really necessary to all mocked object
procedures be virtual? Ive tested it with static methods and it does
not work.


TService = class
public
function DoSomething: Integer; virtual;
procedure Teste;
end;


procedure TForm8.btn1Click(Sender: TObject);
var
MockedService: TMock<TService>;
vService : TService;
begin
MockedService := TMock<TService>.Create;
MockedService.WillReturn(1000).When.DoSomething;
vService := TService(MockedService);
ShowMessage(IntToStr(vService.DoSomething));
end;

===== It does work and shows 1000


TService = class
public
function DoSomething: Integer; //virtual; //comented line
procedure Teste;
end;

===== It does not work and shows 0

Magno Machado

unread,
Aug 20, 2010, 2:19:08 PM8/20/10
to emb...@googlegroups.com
Rafael,

At this moment, only virtual methods can be mocked. Probably dynamic and message (not totaly sure about that) methods can be easily supported and I will certainly do that.

These types of methods (virtual, dynamic and message methods) are easy to mock because the any call to these methods are dispatched through a VMT, so I can hack this VMT and make the calls be directed to the mock implementation of the methods, but static methods are resolved at compile time, so if I want to mock these methods I would have to hack the ASM code generated by the compiler for those methods (this techinique is used on dll hooking libraries also), but that is a lot more complicated (but it IS in my plans).

Any way, I have to warn you that the mock framework isn't ready for production use yet (although many other parts of Emballo are)

Rafael Colucci

unread,
Aug 20, 2010, 2:46:51 PM8/20/10
to emb...@googlegroups.com

Hi

 

I guess you are brazilian, right?

 

OK

 

Pra mim o fmw parece bem produtivo, mesmo você falando que não esta completamente pronto. Foi o único que eu consegui realmente fazer alguma coisa sem ter que programar demais.

Mesmo não aceitando métodos estáticos, isso e facilmente contornável. Basta que eu declare meus métodos como virtuais por enquanto. Quando você fizer ele aceitar métodos estáticos eu mudo os meus métodos de volta.

Outra coisa: você tem alguma previsão de quando ira conseguir fazer isso com métodos estáticos? Caso você precise, eu posso tentar ajudar.

Magno Machado

unread,
Aug 20, 2010, 2:57:27 PM8/20/10
to emb...@googlegroups.com
Sobre os métodos estáticos, eu planejava começar nisso quando já tivesse os mocks funcionando de forma mais madura com métodos virtuais... Mas se você quiser trabalhar nisso eu coloco você com permissão de commit no repositório.
 
A minha idéia era pegar o endereço da memória onde está a implementação do método e alterar o seu conteúdo para adicionar uma instrução JMP que manda a execução para o endereço onde está a implementação que o Emballo criou para aquele método.
 
Na verdade, isso não deve ser feito no framework de mocks, mas sim no framework DynamicProxy do Emballo, esse framework serve de base para o framework de mocks.

Rafael Colucci

unread,
Aug 20, 2010, 4:10:29 PM8/20/10
to emb...@googlegroups.com

Mas já existe algo parecido no fmw DynamicProxy?

Se não existir, eu acho que consigo fazer algo parecido, mas sem usar JMP. Já tive que fazer alguns “hacks” para fazer algo parecido aqui no meu trabalho.

O único porem e que não tenho muito tempo, mas posso sim contribuir com alguma coisa, principalmente se tal funcionalidade não existir ainda.

Magno Machado

unread,
Aug 20, 2010, 4:16:14 PM8/20/10
to emb...@googlegroups.com
O dynamicproxy hoje não suporta métodos estáticos... Assim que suportar, o framework de mocks automaticamente funcionará tambem, pois o dynamicproxy abstrai totalmente esse tipo de coisa

2010/8/20 Rafael Colucci <rafac...@gmail.com>

Rafael Colucci

unread,
Aug 20, 2010, 4:44:02 PM8/20/10
to emb...@googlegroups.com

Opa

 

Entao eu posso tentar fazer uma classe ou algo parecido, baseado no que já existe e mandar o código pra você. Ai você adiciona ela no fmw (pois eu não saberia fazer) e depois faz o mock funcionar ... Pode ser? Eu acho que assim fica pouco trabalho pra você.

Magno Machado

unread,
Aug 20, 2010, 4:49:49 PM8/20/10
to emb...@googlegroups.com
Beleza, pode ser sim, ficarei muito agradecido
 
Só gostaria de te avisar mais uma vez que ainda falta um bom caminho para ele ser "usavel" em produção.... Até agora os parâmetros e retornos dos métodos "mockados" só podem ser do tipo Integer

2010/8/20 Rafael Colucci <rafac...@gmail.com>

Rafael Colucci

unread,
Aug 20, 2010, 4:52:05 PM8/20/10
to emb...@googlegroups.com

Qual e o problema em retornar outros tipos?

Em 20/08/2010 17:49, "Magno Machado" <mag...@gmail.com>escreveu:

Beleza, pode ser sim, ficarei muito agradecido
 
Só gostaria de te avisar mais uma vez que ainda falta um bom caminho para ele ser "usavel" em produção.... Até agora os parâmetros e retornos dos métodos "mockados" só podem ser do tipo Integer

2010/8/20 Rafael Colucci <rafac...@gmail.com>
>
> Opa
>
>  
>

> Entao eu posso tentar fazer uma c...

Magno Machado

unread,
Aug 20, 2010, 4:56:01 PM8/20/10
to emb...@googlegroups.com
Nehum, apenas não está implementado ainda.
Aquele método MockService.WillReturn(), por enquanto só está implementado para integer... Mas claro, isso vai mudar logo
 

Posso saber de onde você é?
2010/8/20 Rafael Colucci <rafac...@gmail.com>

Magno Machado

unread,
Aug 20, 2010, 4:57:07 PM8/20/10
to emb...@googlegroups.com
>MockService.WillReturn(),
Desculpe, quis dizer TMocked.WillReturn

2010/8/20 Magno Machado <mag...@gmail.com>

Rafael Colucci

unread,
Aug 20, 2010, 4:57:56 PM8/20/10
to emb...@googlegroups.com

Ah.

 

Isso não e problema, se for so fazer um overload da função eu mesmo faço e te passo.

Tenho muito interesse em fazer isso ir pra frente. Eu realmente não conheço nenhuma ferramenta descente pra fazer mocks em Delphi.

A sua parece estar indo por um caminho legal.

 

De: emb...@googlegroups.com [mailto:emb...@googlegroups.com] Em nome de Magno Machado
Enviada em: sexta-feira, 20 de agosto de 2010 17:56
Para: emb...@googlegroups.com
Assunto: Re: [Emballo] Virtual Methods x Static Methods - Mock

 

Nehum, apenas não está implementado ainda.

Magno Machado

unread,
Aug 20, 2010, 5:15:27 PM8/20/10
to emb...@googlegroups.com
É, infelizmente não existem muitas opções mesmo. Eu conheço apenas o pascalmock, mas nele você tem que programar muito pra fazer ele funcionar.
 
O problema é que só recentemente o Delphi incorporou os recursos necessarios para tornar projetos como o Emballo possíveis, no caso do mock ele depende muito da nova RTTI do Delphi

2010/8/20 Rafael Colucci <rafac...@gmail.com>
Reply all
Reply to author
Forward
0 new messages