Question

Disons que j'ai la classe A avec

class A {
  final String foo() {
    // .. computing result, contacting database, whatever ..
    return "some computed value";
  }
  // ... and a bazillion other methods, some of them final.
}

Maintenant, j'ai la classe B avec

class B {
  String methodIWantToTest(A a) {
      String output = a.foo();
      // ... whatever this method does, e.g.:
      output += "_suffix";
      return output;
  }
}

Comment pourrais-je procéder pour tester cette méthode par unité? La raison pour laquelle foo () est finale est que nous ne voulons pas que nos classes qui étendent A modifient ses fonctionnalités. Mais en même temps, pour vraiment tester la méthode, je ne veux pas qu’elle s’applique et exécute la méthode A.foo () .

Y a-t-il un moyen, par exemple, de supprimer le mot-clé final et d'ajouter une annotation dans le sens de @finalUnlessTest ? Que recommanderais-tu? Refactoriser A vers une interface serait très, très difficile, vu que c'est une de nos classes centrales et est malheureusement jolie extrêmement couplée.

Modifier n ° 1 : Désolé, j'ai oublié de mentionner, nous parlons de Java. Nous n'utilisons pas encore de cadre moqueur.

Répondre : OK, wow. JMockit est tout simplement incroyable et est à mes yeux l'application phare pour tester le code hérité. Incroyablement utile surtout dans mon cas. Merci beaucoup! Vous feriez essentiellement quelque chose comme ce qui suit pour mon exemple psuedo:

class AMock {
   final String foo() {
     return "myTestValue";
   }
}
class Test extends TestCase {
   A mockedA;
   B b;
   protected void setUp() {
      Mockit.redefineMethods( A.class, AMock.class );  // this "pipes" all mocked methods from A to AMock
      mockedA = new A();    // NOT new AMock()!!!
      b = new B();
   }
   public void testB() {
      assertEquals("myTestValue",mockedA.foo());
      assertEquals("myTestValue_suffix",b.methodIWantToTest(mockedA));
   }
}

Est-ce que ce frickin 'cool ou quoi?

Était-ce utile?

La solution

Vous pouvez essayer la bibliothèque moqueuse JMockit .

Autres conseils

Je supprimerais le " final " et mettez juste un commentaire "Ne remplacez pas cette méthode !!". Si vous ne pouvez pas faire confiance à vos collègues pour ne pas suivre des instructions simples, c’est quand même désespéré.

Le code suivant vous permettra également de le faire. Je ne dis pas que c’est une bonne pratique, mais c’est un usage intéressant (abus?) De classes anonymes.

public class Jobber {

    public final String foo() {
        return fooFactory() ;
    }

    String fooFactory() {
        return "jobber" ;
    }


    public static void main(String[] args) {

        Jobber jobber = new Jobber() { String fooFactory() { return "prefix " + super.fooFactory() ;} } ;

        System.out.println(jobber.foo() );
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top