Teste result.redirectTo de um controller

Fala Pessoal,

Estou tentando fazer um teste integrado para o um método de um controle.

[code]@Post("/Administrador")
public void login(final UserWeb user) throws Exception
{
User loaded = null;

	this.validator.validate(user);
	
	this.validator.onErrorUsePageOf(this).show();
	
	if(!this.validator.hasErrors())
	{
		loaded = users.load(user.getName(), user.getPassword());
		
		if(loaded == null){
			this.validator.add(new ValidationMessage("Usuário ou senha inválidos.", "user.invalid"));
		}
	}
	
	this.validator.onErrorUsePageOf(this).show();
	userWeb.login(loaded);
		
	result.redirectTo(HomeController.class).show();
}[/code]

O teste que eu fiz foi:

[code]
@Test
public void test() throws Exception {
//Assert
MockResult result = new MockResult();
MockValidator validator = new MockValidator();
UserWeb userWeb = new UserWeb(“administrador”, “123456”);
SessionFactoryBuilder factory = new SessionFactoryBuilder();
factory.open();
SessionBuilder sessionBuilder = new SessionBuilder(factory.getInstance());
sessionBuilder.open();
Session session = sessionBuilder.getInstance();
IUsers users = new Users(session);
LoginController login = new LoginController(result, validator, userWeb, users);

	//Act
	login.login(userWeb);
	
	//Assert
	Mockito.verify(result).redirectTo(HomeController.class).show();
}[/code]

Neste teste não consigo validar o result.redirectTo.
Como faço para fazer esta validação?

Obrigado pela ajuda,

Rodrigo

Para fazer essa validação vc vai ter que stubar o controller primeiro:

//no começo do método
HomeController mockController = mock(HomeController.class);
when(result.redirectTo(HomeController.class)).thenReturn(mockController);

//no final do método
verify(mockController).show();

Oi Lucas,

Obrigado pela dica.

Para funcionar além da sua dica tive que alterar como estava inicializando o Result.

Meu código ficou assim:

public class LoginControllerTest {

	private Result result;
	private IUsers users;
	private Validator validator;

	@Before
	public void setUp()
	{
		this.result = spy(new MockResult());
		this.validator = new MockValidator();
		SessionFactoryBuilder factory = new SessionFactoryBuilder();
		factory.open();
		SessionBuilder sessionBuilder = new SessionBuilder(factory.getInstance());
		sessionBuilder.open();
		Session session = sessionBuilder.getInstance();
		
		this.users = new Users(session);
	}
	
	@Test
	public void test() throws Exception {
		//Assert
		HomeController mockHomeController = mock(HomeController.class);
		when(result.redirectTo(HomeController.class)).thenReturn(mockHomeController);
		
		UserWeb userWeb = new UserWeb("administrador", "123456");
		
		LoginController login = new LoginController(result, validator, userWeb, users);
		
		 
		//Act
		login.login(userWeb);
		
		//Assert
		verify(mockHomeController).show();
	}

}

Esta é a forma de fazer?

Estou querendo fazer testes de integração.
Neste caso eu precisaria mockar o Result?
Tem como eu fazer o teste sem mockar o Result?

No ASP.Net MVC eu trabalho com o Result sem precisar mocka-lo.
Desta forma:

//Act
var result = controller.Index(login) as RedirectToRouteResult;

//Assert
Assert.AreEqual(result.RouteValues["controller"].ToString(), "Principal");

Consigo fazer o mesmo no VRaptor?

Obrigado,

Rodrigo Morais

É algo assim mesmo…

teste de integração que vc fala é fazendo requisições web?

O teste seria com o JUnit mesmo.

Minha dúvida é se sempre terei que mockar o Result ou isso é desnecessário e existe outra forma de fazer o teste.

Obrigado.

já que vc não vai rodar uma request web no teste, vc vai querer passar as dependências de verdade para o controller e rodar o método, certo?

nesse caso vc usa o mockResult mesmo, para ignorar o comportamento do VRaptor…

daí vc analisa o resultado usando o mockResult.included()… ou o retorno do método.

Se vc quiser usar um Result de verdade vc precisa ter o request e o response populados.