O nome do cara é JMockit
Bem, o meu exemplo é bem simples:
Criei uma classe que tem somente um método estático, é esta classe que quero mockar:
0: public class ClasseUtil {Então, uma classe que utiliza este método:
1: public static int metodoEstatico()
2: {
3: return 1;
4: }
5: }
0: public class ClasseFuncionalidade {Por fim, a classe de teste:
1: public static int metodoLocal()
2: {
3: return ClasseUtil.metodoEstatico();
4: }
5: }
0: public class ClasseFuncionalidadeTeste{Perceba que criei uma outra classe (inner class) chamada MockClasseUtil, com um método (metodoEstatico) de mesma assinatura do método da classe ClasseUtil, porém o retorno é diferente (No original é 1 e no falso é 0).
1:
2: public static class MockClasseUtil{
3: public static int metodoEstatico()
4: {
5: return 0;
6: }
7: }
8:
9: @Before
10: public void prepare(){
11: Mockit.redefineMethods(
12: ClasseUtil.class,
13: MockClasseUtil.class);
14: }
15:
16: @After
17: public void finalize(){
18: Mockit.restoreAllOriginalDefinitions();
19: }
20:
21: @Test
22: public void metodoLocal(){
23: assertEquals(0, ClasseFuncionalidade.
24: metodoLocal());
25: }
26: }
Redefino os métodos da classe real pelos da classe mock:
0: @BeforeSe fosse no JUnit3, poderia usar o método setUp para invocar o redefineMethods.
1: public void prepare(){
2: Mockit.redefineMethods(
3: ClasseUtil.class,
4: MockClasseUtil.class);
5: }
E para voltar "ao normal":
0: @AfterA única dificuldade foi "ver" que o comando "-javaagent:jmockit.jar" deve ser passado como parâmetro para a JVM:
1: public void finalize(){
2: Mockit.restoreAllOriginalDefinitions();
3: }
No eclipse é só fazer isso, na hora de rodar o teste:
ou isso, para rodar com test suite ou qualquer outro lugar: