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.