VIP: O Jeito Certo
de Fazer a Coisa Errada
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:
- Não testar o membro: Não
faça isso. Mesmo.
- Mudar para visibilidade de pacote:
Simples mas intrusivo, porquê está modificando
código de produção por causa de um
teste.
- Criar uma classe de teste interna: Ainda
mais intrusivo, porquê código de
teste será publicado junto com o código de
produção.
- Usar reflexão: não intrusivo
mas pouco elegante.
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.