Junit vraptor 3

4 respostas
boneazul

Pessoal li a documentação sobre teste do vraptor usando o junit mais ficou um pouco vaga a ideia…
queria fazer uns tests cases dos meus controllers…
alguem poderia postar um exemplo completo de teste pra mim…

Ou algum exemplo com esse controller dai me viro com o resto num to sabendo começar…

package br.com.jslsolucoes.granchef.controllers;

import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.view.Results;
import br.com.jslsolucoes.granchef.annotations.VerifyAccess;
import br.com.jslsolucoes.granchef.dao.EstadoDao;
import br.com.jslsolucoes.granchef.models.Estado;

@Resource
public class EstadoController {
	private EstadoDao daoEstado;
	private Result result;
	

	public EstadoController(EstadoDao daoEstado,Result result) {
		this.daoEstado = daoEstado;
		this.result = result;
	}

	@VerifyAccess(action = 57)
	public void lista() {
		result.include("estadoList", daoEstado.listaTodos());
	}

	@VerifyAccess(action = 58)
	public void form() {
		
	}
	
	public void mensagem() {
	}

	@Post
	@Path("/estado/adiciona")
	public void adiciona(Estado estado) {
		if (estado.getId() == null) {
			result.include("insert", true);
			daoEstado.adiciona(estado);
		} else {
			result.include("insert", false);
			daoEstado.atualiza(estado);
		}
		result.use(Results.logic()).redirectTo(EstadoController.class).mensagem();
	}

	@VerifyAccess(action = 59)
	@Path("/estado/edit/{estado.id}")
	public void edita(Estado estado) {
		result.include("estado", daoEstado
				.recupera(estado.getId()));
		result.use(Results.page()).forward("/WEB-INF/jsp/estado/form.jsp");
	}

	@VerifyAccess(action = 60)
	@Path("/estado/delete/{ids}")
	public void delete(String ids) {
		for (String id : ids.split(","))
			daoEstado.desativa(daoEstado.recupera(new Long(id)));
		result.use(Results.nothing());
	}
}

Como eu testo isso??

4 Respostas

Lucas_Cavalcanti

Olá,

Se você for criar testes unitários pra essa classe (ou pra uma classe em geral) você tem que pensar no seguinte:

  • sua classe possui duas dependências: EstadoDao e Result
  • para testar essa classe, vc precisa instanciá-la, passando as dependências pelo construtor.
  • Em geral não passamos as implementações de verdade, passamos uma implementação controlada, que pode tanto ser uma classe nova da sua aplicação, quanto um mock. Para criar mocks vc usa outros frameworks, como o Mockito (mockito.org) ou JMock(jmock.org)
  • Para a classe Result, o VRaptor já disponibiliza uma implementação falsa que só ignora as chamadas, acumulando os objetos incluidos, essa classe é a MockResult.

seria algo do tipo:

dao = mock(EstadoDao.class);
controller = new EstadoController(dao, new MockResult());

//faça os stubs do mock
// chame o método do controller que vc quer testar
// faça os asserts do teste
boneazul
lucascs:
Olá,

Se você for criar testes unitários pra essa classe (ou pra uma classe em geral) você tem que pensar no seguinte:

- sua classe possui duas dependências: EstadoDao e Result
- para testar essa classe, vc precisa instanciá-la, passando as dependências pelo construtor.
- Em geral não passamos as implementações de verdade, passamos uma implementação controlada, que pode tanto ser uma classe nova da sua aplicação, quanto um mock. Para criar mocks vc usa outros frameworks, como o Mockito (mockito.org) ou JMock(jmock.org)
- Para a classe Result, o VRaptor já disponibiliza uma implementação falsa que só ignora as chamadas, acumulando os objetos incluidos, essa classe é a MockResult.

seria algo do tipo:

dao = mock(EstadoDao.class);
controller = new EstadoController(dao, new MockResult());

//faça os stubs do mock
// chame o método do controller que vc quer testar
// faça os asserts do teste

Entendi em partes sobre a implementação falsa estou fazendo o teste mas pelo que vi JMock por exemplo faz implementações falsas de interface apenas mas meu EstadoDao é um classe ai vi que tem um modo de fazer mocks de classes, mas mesmo assim ainda nao entendi bem a ideia... vo postar um exemplo de teste
pra ver se voce me ajuda....

package br.com.jslsolucoes.granchef.tests;

import java.util.List;

import junit.framework.Assert;
import junit.framework.TestCase;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.jmock.Mockery;
import org.jmock.lib.legacy.ClassImposteriser;
import org.junit.Test;

import br.com.caelum.vraptor.util.test.MockResult;
import br.com.jslsolucoes.granchef.controllers.EstadoController;
import br.com.jslsolucoes.granchef.dao.EstadoDao;
import br.com.jslsolucoes.granchef.models.Estado;

public class EstadoTests extends TestCase{
	@Test
	public void testList()
	{
		Mockery mockery = new Mockery() {{
	          setImposteriser(ClassImposteriser.INSTANCE);
	        }};
		EstadoDao dao = mockery.mock(EstadoDao.class);
		MockResult result = new MockResult();
		
		EstadoController controller = new EstadoController(dao,result);
		controller.lista();
		List<Estado> estados = result.included("estadoList");
		Assert.assertNotNull(estados);
	}
}

Mas levo esse erro
unexpected invocation: estadoDao.listaTodos()
no expectations specified: did you...
- forget to start an expectation with a cardinality clause?
- call a mocked method to specify the parameter of an expectation?
what happened before this: nothing!
at org.jmock.internal.InvocationDispatcher.dispatch(InvocationDispatcher.java:56)
at org.jmock.Mockery.dispatch(Mockery.java:218)
at org.jmock.Mockery.access$000(Mockery.java:43)
at org.jmock.Mockery$MockObject.invoke(Mockery.java:258)
at org.jmock.internal.InvocationDiverter.invoke(InvocationDiverter.java:27)
at org.jmock.internal.FakeObjectMethods.invoke(FakeObjectMethods.java:38)
at org.jmock.lib.legacy.ClassImposteriser$4.invoke(ClassImposteriser.java:137)
at br.com.jslsolucoes.granchef.dao.EstadoDao$$EnhancerByCGLIB$$e9a2f3bd.listaTodos()
at br.com.jslsolucoes.granchef.controllers.EstadoController.lista(EstadoController.java:25)
at br.com.jslsolucoes.granchef.tests.EstadoTests.testList(EstadoTests.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:168)
at junit.framework.TestCase.runBare(TestCase.java:134)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:232)
at junit.framework.TestSuite.run(TestSuite.java:227)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Essas expectations seria o que?? Pq meu EstadoDao precisa de uma Session do hibernate como dependencia pra funcionar..se não for muito incomodo

Paulo_Silveira

ola boneazul

sobre os expectations, vale a pena ler o cookbooks do JMock:
http://www.jmock.org/cookbook.html

La que voce fala como voce espera que seus mocks devem agir em determinadas situacoes.

algo como:

Estado SP = new Estado("Sao Paulo");
final List<Estado> listaDeEstados = Arrays.asList(SP, RJ, BLA);

context.checking(new Expectations() {{
    oneOf (dao).listaTodos();
    will(returnValue(listaDeEstados));
}});
boneazul
Paulo Silveira:
ola boneazul

sobre os expectations, vale a pena ler o cookbooks do JMock:
http://www.jmock.org/cookbook.html

La que voce fala como voce espera que seus mocks devem agir em determinadas situacoes.

algo como:

Estado SP = new Estado("Sao Paulo");
final List<Estado> listaDeEstados = Arrays.asList(SP, RJ, BLA);

context.checking(new Expectations() {{
    oneOf (dao).listaTodos();
    will(returnValue(listaDeEstados));
}});

Hum vi a implementação que estava usando era relativa ao JMock enquanto o lucas deu exemplo sobre o mockito usei o exemplo do mockito e rolou o teste..

EstadoDao dao = mock(EstadoDao.class);
		MockResult result = new MockResult();
		EstadoController controller = new EstadoController(dao,result);
		controller.lista();
		List<Estado> estados = result.included("estadoList");
		Assert.assertNotNull(estados);

Obrigado pela ajuda!!

Criado 9 de janeiro de 2010
Ultima resposta 9 de jan. de 2010
Respostas 4
Participantes 3