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.