[Resolvido]Dúvida sobre JMock 2.5.1!

2 respostas
rdantas

Bom dia pessoal,

Estou usando a versão 2.5.1 do JMock e o JUnit 4.4. Ao escrever meus métodos de teste eu me deparei com uma situação onde não consegui identificar qual recurso do JMock eu deveria usar. No meu caso de uso tenho uma classe chamada AlunoCursoBean que faz a persistencia dos dados referentes à entidade AlunoCurso. Dentro dela eu tenho um atributo de Session (Hibernate) como segue abaixo:

public class AlunoCursoBean implements AlunoCursoBeanLocal{

	@PersistenContext
        private Session session;
	....
       //criei tambem o metodo setSession para usar no JUnit e setar o mock
          
       public AlunoCurso getAlunoCursoPorLogin(String login) {
            return (AlunoCurso)session.createCriteria(AlunoCurso.class)
		        .add(Restrictions.eq("codigo", Integer.parseInt(login)));		
                        .uniqueResult();
       }          
   }

Na minha classe de teste fiz o seguinte:

@Test  
	public void testGetAlunoCursoPorLogin() {
            	/*context é atributo da classe de teste: private static Mockery context = new JUnit4Mockery(){{setImposteriser(ClassImposteriser.INSTANCE);}};*/
            context.checking(new Expectations() {{ 
		final AlunoCurso alunoCurso = new AlunoCurso();
		final Criteria criteria = context.mock(Criteria.class);	
		
	 	oneOf(session).createCriteria(AlunoCurso.class); will(returnValue(criteria));  
		oneOf(criteria).add(Restrictions.eq("codigo", Integer.parseInt("403535"))); will(returnValue(criteria));   
		oneOf(criteria).uniqueResult(); will(returnValue(alunoCurso));
            }});
	    alunoCursoBean.setSession(session);	
	    AlunoCurso alunoCurso = alunoCursoBean.getAlunoCursoPorLogin("403535");
	    assertNotNull(alunoCurso);
	}

Pois sim, o que ocorre é que quando eu chamo o metodo createCriteria(...) do meu objeto mock(session) é criado um objeto da classe Criteria, então criei um
mock para ele também e dele eu chamo o metodo uniqueResult() para me retornar o objeto da classe AlunoCurso. Quando eu coloco para executar eu recebo a
seguinte exceção vinda do JUnit:

java.lang.AssertionError: unexpected invocation: criteria.add(<codigo=403535>)
expectations:
  expected once, already invoked 1 time: session.createCriteria(<class br.edu.uniformg.academico.entidade.AlunoCurso>); returns <criteria>
  expected once, never invoked: criteria.add(<codigo=403535>); returns <criteria>
  expected once, never invoked: criteria.uniqueResult(); returns <Não definido>
what happened before this:
  session.createCriteria(<class br.edu.uniformg.academico.entidade.AlunoCurso>)

	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 org.hibernate.Criteria$$EnhancerByCGLIB$$512cd4b0.add(<generated>)
	at br.edu.uniformg.academico.sb.AlunoCursoBean.getAlunoCursoPorLogin(AlunoCursoBean.java:53)
	at br.edu.uniformg.academico.sb.AlunoCursoBeanTeste.testGetAlunoCursoPorLogin(AlunoCursoBeanTeste.java:65)
        ...

Alguém tem alguma idéia de como eu posso usar o JMock para testar a estrutura acima? Ou talvez eu deva reescrever minha implementação para que a classe de teste consiga executar?

Obrigado pela atenção,

Rodrigo.

2 Respostas

panachi

Na chamada do

você está verificando a chamada de um objeto Restrictions mas ele não deve ter um método equals() implementado. Tente usar:

ou se for necessário verificar o objeto Restriction, tente usar uma classe anonima com método equals sobrescrito:

oneOf(criteria).add(with(new Restriction() { public boolean equals(Object o) { return this.getKey().equals("codigo") && this.getValue().equals(403535); } })); will(returnValue(criteria));
Espero ter ajudado

ps: não me lembro de cabeça se Restriction tem esse comportamento do equals() nem esses métodos… é só uma sugestão.

rdantas
WôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôWWWWW!!! 

 Funfou 100% Mto obrigado Panachi!  Te devo essa.... já estava batendo cabeça com isso a dias, inclusive cheguei a postar o problema no Mailing list do JMock.org e ainda não tinha conseguido a solução do problema.

Valeu mesmo.

Criado 4 de março de 2009
Ultima resposta 4 de mar. de 2009
Respostas 2
Participantes 2