Méthode finale moqueur

J'ai besoin de se moquer un peu de classe avec la méthode définitive à l'aide de mockito. J'ai écrit quelque chose comme cela

@Test
public void test() {
    B b = mock(B.class);
    doReturn("bar called").when(b).bar();   
    assertEquals("must be \"overrided\"", "bar called", b.bar());
    //bla-bla
}


class B {
    public final String bar() {
        return "fail";
    }
}

Mais il échoue.
J'ai essayé quelques "hack" et ça fonctionne.

   @Test
   public void hackTest() {
        class NewB extends B {
            public String barForTest() {
                return bar();
            }
        }
        NewB b = mock(NewB.class);
        doReturn("bar called").when(b).barForTest();
        assertEquals("must be \"overrided\"", "bar called", b.barForTest());
    }

Cela fonctionne, mais les "odeurs".

Alors, Où est la bonne façon?

Grâce.

  • L'idéal est de ne pas avoir besoin de se moquer de finale méthodes, bien sûr. Vous n'avez pas nous dit rien au sujet de pourquoi vous essayez de faire cela. J'ai l'habitude de tenter dur de garder mon dépendances à des interfaces... est-il possible que vous pouvez utiliser une interface de procurations de la vraie classe (en supposant que vous ne pouvez pas modifier la classe elle-même)?
  • Cette classe à partir d'un code existant.
  • Vous n'avez pas l'option à modifier? Ou proxy via une autre classe qui implémente une interface?
  • Skeet: je ne peux pas le modifier. Vous voyez, c'est la bibliothèque (SWT). Il y a l'interface IFigure et la mise en œuvre - la Figure. Mais IFigure ne débite pas contient getLocation().
  • Skeet: désolé, pas de SWT. C'est org.eclipse.draw2d.
InformationsquelleAutor Stan Kurilin | 2010-09-25