Boa tarde, alguém sabe como mockar o result para pegar o redirectTo usando jMock no Vraptor.
Tentei algo assim:
public class RockControllerTest {
private Mockery mockery;
private RockController controller;
@Before
public void setUp() throws Exception {
mockery = new Mockery();
Result result = mockery.mock(Result.class);
controller = new RockController(result);
}
@Test
public void testRedirectTo(){
mockery.checking(new Expectations{{
one(result).redirectTo(RockController.class);
}});
controller.roll(); // o redirect está dentro do método roll
}
}
// o roll tem mais ou menos este aspecto
public void roll(){
result.redirectTo(RockController.class);
}
No caso acima, dá Exception dizendo que não pode fazer cast de Object para
Se trocar o Expectation para one(result).redirectTo( an(RockController.class)); e no roll usar result utilizar result.redirectTo(RockController.class);, o JUnit mostra a mensagem dizendo que o Expectation esta instalado mas não recebeu um objeto do tipo RollController
o problema é que o jmock não sabe o que retornar…
vc vai precisar fazer:
one(result).redirectTo(RockController.class);
will(returnValue(mockery.mock(RockController.class)));
ou algo do tipo…
vc também pode fazer um spy no MockResult do VRaptor
Lucas, vc está correto. Assim funcionou. Mas ainda estou com uma dúvida, como fazer para pegar o método quando é chamado após o redirect. Pore exemplo:
public void roll(){
result.redirectTo(RockController.class).jump();
}
Como pegar o jump()?
one(mockRockController).jump();
Lucas, o RockController é a classe de teste. Não posso mocka-la, correto?
vc vai ter duas instâncias, uma de verdade e uma mockada…
a mockada vc só vai usar para verificar que o jump foi chamado no redirecionamento
Como eu instanciaria essa classe mockada dentro da outra, uma vez q elas são do mesmo controlador?
vc não vai instanciar a classe mockada dentro da outra… vc vai fazer isso na classe de testes.
algo como:
MeuController controller = new MeuController(....);
MeuController mockController = ....mock(MeuController.class);
Ficaria dessa maneira?
public class RockControllerTest {
private Mockery mockery;
private RockController controller;
@Before
public void setUp() throws Exception {
mockery = new Mockery();
Result result = mockery.mock(Result.class);
controller = new RockController(result);
mockRockController = mockery.mock(RockController.class);
}
@Test
public void testRedirectTo(){
mockery.checking(new Expectations{{
one(mockRockController).jump();
}});
mockRockController.roll(); // o redirect está dentro do método roll
}
}
// o roll tem mais ou menos este aspecto
public void roll(){
result.redirectTo(RockController.class).jump();
}
quase isso…
no teste, na hora de invocar o metodo roll tem que ser no controller de verdade, não no mock…
e vc tb tem que fazer a expectation pra retornar o mock:
allowing(result).redirectTo(RockController.class);
will(returnValue(mockController));