Existe uma maneira no JMockit de chamar o método original de um método simulado?
Na minha classe mock, estou zombando do método foo (). Para alguns casos de teste, quero que a implementação simulada de foo () retorne um valor especial. Para outros casos de teste, quero usar a implementação real de foo (). Eu tenho um booleano definido na minha classe de simulação para poder determinar no método de simulação se quero retornar o valor especial ou usar o método "real". O problema é que não consigo descobrir como chamar o método real a partir do método zombado.
Descobri que você pode definir um membro especial dentro do objeto simulado chamado "it" (com o tipo do objeto sendo zombado). Isso permite que você faça referência à classe real a partir da implementação simulada. Portanto, meu plano era que, se eu precisasse invocar a implementação "real" de foo (), o método mock chamaria it.foo (). No entanto, isso não funciona, porque chamá-lo.foo () apenas chama a versão simulada novamente, não a versão real, então eu termino com recursão infinita.
Existe alguma maneira de fazer isso funcionar?
EDIT: pode ser mais claro com um exemplo de código, eis a minha implementação atual de método simulado:
private RealClass it;
...
public SomeClass foo() {
if(fakeIt) {
return new SomeClass("fakevalue");
} else {
// doesn't work, just keeps calling the mock foo
// in infinite recursion
return it.foo();
}
}
EDIT 2: Além disso, na maioria dos meus casos de teste,NÃO quer a implementação simulada. Portanto, minha tentativa inicial foi chamar apenas Mockit.redefineMethods () nos casos de teste em que eu precisava do objeto simulado. Mas isso não funcionou - parece que você só pode fazer isso dentro da instalação / desmontagem ... minha implementação simulada nunca foi chamada quando tentei isso.
NOTAS SOBRE SOLUÇÃO:
No começo, não achei que a resposta dada funcionasse, mas depois de brincar um pouco mais, parece que o problema é que eu estava misturando os métodos "principais" do JMockit com os métodos orientados pela "anotação". Aparentemente, ao usar a anotação, você precisa usar Mockit.setupMocks, não Mockit.redefineMethods (). Isto é o que finalmente funcionou:
@Before
public void setUp() throws Exception
{
Mockit.setUpMocks(MyMockClass.class);
}
Então, para a classe simulada:
@MockClass(realClass = RealClass.class)
public static class MyMockClass {
private static boolean fakeIt = false;
private RealClass it;
@Mock(reentrant = true)
public SomeClass foo() {
if(fakeIt) {
return new SomeClass("fakevalue");
} else {
return it.foo();
}
}
}