Como mockar o Result para pegar o redirectTo - Vraptor + Jmock

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));