Um dos frameworks que mais gosto de trabalhar, devido a sua simplicidade e produtividade e o Vraptor. Uma das suas vantagens e que ele abstrai a complexidade da API de Servlets, NAO te obriga a trabalhar com getters/setters evitando que seu modelo se torne anemico. Nao e intrusivo, voce foca na sua logica de negocios e nao em aprender sobre a arquitetura e classes do framework, ou seja, a curva de aprendizado e minima.Trabalha de forma muito facil com injecao de dependencia. Nao e necessario configurar quase nada. Tem suporte a REST e inumeros outros recursos. Mas oque chama realmente a atencao e que voce consegue comecar a trabalhar com ele em questao de minutos. Poderiamos ficar o dia todo discutindo sobre as vantagens de utilizar este framework. Portanto vamos ao objetivo do post: Aprender a testar unitariamente as classes de controller do Vraptor.Para isso utilizaremos o JUnit e o Mockito.Desejamos testar o metodo salva(Aluno aluno) do controller abaixo. Este metodo recebe um aluno, verifica se e valido, salva e redireciona para a listagem, caso o aluno seja inconsistente ele redireciona para a pagina de cadastro/edicao para exibir os erros.@Resourcepublic class AlunoController {private AlunoRepository alunoRepository; private Result result; private Validator validator; public AlunoController(AlunoRepository alunoRepository, Result result, Validator validator) { this.alunoRepository = alunoRepository; this.result = result; this.validator = validator; } public void add(Aluno aluno) { this.validator.validate(aluno); this.validator.onErrorForwardTo(this).cadastra(); this.alunoRepository.add(aluno); this.result.redirectTo(this).lista(); }}Temos como dependencia a interface AlunoRepository e como o objetivo e testar o controller, devemos mockar esta dependencia.Criamos uma classe de teste comum do JUnit.public class AlunoControllerTest { private AlunoController controller; private AlunoRepository alunoRepository; private MockResult result; private JSR303MockValidator validator; @Before public void setUp() throws Exception { this.alunoRepository = mock(AlunoRepository.class); result = spy(new MockResult()); validator = spy(new JSR303MockValidator()); controller = new AlunoController(alunoRepository, turmaRepository, result, validator); }}Note que os objetos result e validator usam mocks apropriados, portanto nao precisamos nos preocupar com eles. E melhor utilizar estes mocks fornecidos, pois estes objetos usam Fluent Interface oque torna sua testabilidade muito dificil.Repare tambem que usamos o metodo spy(T object) para obter as instancias do result e validator, isso e util pois conseguimos chamar os metodos reais dos objetos, entao podemos verificar se realmente houveram interacoes com os objetos.O teste:@Testpublic void add() { Aluno aluno = getAlunoConsistente(); controller.add(aluno); verify(alunoRepository).add(aluno);}Atraves deste teste tentamos salvar um aluno, que e um objeto consistente (valido). Entao o aluno deve ser adicionado ao repositorio, portanto nos asseguramos que o metodo add(Aluno aluno) do repositorio foi chamado, isso e feito atraves da linha: verify(alunoRepository).add(aluno);Para testarmos nossas validacoes, desenvolvemos um teste que espera que uma ValidationException seja lancada e nos asseguramos que nao houveram interacoes com o repositorio:@Test(expected = ValidationException.class)public void gravaAlunoInconsistenteTest() { controller.grava(getAlunoInconsistente()); verifyNoMoreInteractions(alunoRepository);}Esse post teve origem em uma thread do GUJ que abri e recebi orientacoes do Lucas Cavalcanti: http://www.guj.com.br/java/243436-vraptor-e-mockito---testes-de-controllersUPDATE:Muitas vezes desejamos verificar se o nosso metodo fez um redirecionamento para uma view ou logica especifica. Entao como o Lucas citou, podemos fazer:AlunoController spy = Mockito.spy(alunoController); when(result.redirectTo(alunoController)).thenReturn(spy); this.alunoController.grava(aluno); verify(spy).lista();Assim estamos nos assegurando que o metodo lista() foi chamado, ou seja, foi feito o redirecionamento.Abracos Em um post anterior comecei uma serie sobre