VIP: O Jeito Certo de Fazer a Coisa Errada

ENGLISH
SourceForge.net Logo

Introdução
Como Funciona?
Fake Accessors
Exemplo
Download
Contato

Introdução

Se você escreve testes de unidade nos seus projetos java, então já teve esse problema antes: membros privados. Existem quatro soluções para testar um membro privado:

Escrevi VIP porquê prefiro usar reflexão nos meus casos de teste, mas não gosto de toda aquela parafernalha reflexiva. Então bolei um utilitário pequeno e simples que faz a reflexão para você.

VIP significa Very Important Proxy ;-)

Como Funciona?

VIP cria um proxy dinâmico que implementa uma interface definida por você. Não é necessário configuração xml; a interface deve conter toda informação necessária. Se quiser testar um método privado, adicione o mesmo método na interface (exceto por modificadores como private, static, etc). VIP retorna um proxy dinâmico que implementa essa interface, para que você possa invocar o método como se fosse público. VIP mantém uma instância da classe alvo e redireciona as invocações de método, casando as assinaturas dos métodos e fazendo a reflexão para você.

Fake Accessors

Além de invocar métodos privados, você pode também acessar atributos privados. Se a classe alvo não oferece accessors públicos, VIP lhe oferece fake accessors. Tudo que você precisa fazer é declarar os accessors na sua interface, seguindo a convenção de nomes do java. Quando você invoca um fake accessor o VIP percebe que não há método semelhante na classe alvo e procura por um atributo correspondente ao nome do accessor.

Exemplo

Suponha que você deseja testar a seguinte classe:

public class Foo {
	private int unreachable = 10;

private String sayBar() {
return "Bar!";
}

public Foo() {
}
}

Passo 1: Definir uma interface, declarando como público todos os membros privados que você quer acessar. A interface deve fazer parte do código de teste que não será publicado com a sua aplicação. Sugiro incluir a interface no mesmo arquivo do teste de unidade.

interface IFoo {
int getUnreachable();
void setUnreachable(int unreachable);
String sayBar();
}

Passo 2: Requisitar ao VIP um proxy no seu teste.

public void testFoo() throws Exception {
...
IFoo proxy = (IFoo) VIPMaker.makeProxyForInstance(new Foo(), IFoo.class);

proxy.setUnreachable(20);
assertEquals(20, proxy.getUnreachable());
assertEquals("Bar!", proxy.sayBar());
...
}

Isso é tudo. Você pode também chamar VIPMaker.makeProxyForClass(Class, Class), caso você queira que o VIP instancie a classe alvo para você, tentando todos os construtores possíveis.

Contato

Bernardo O. Bennett é consultor java, atualmente trabalhando em conjunto com a Sakonnet Technology LLC. Se você tiver dúvidas ou sugestões mande um e-mail.