Maquette privé de la méthode de la même classe qui est en train d'être testé

J'ai une classe Java nommée, MyClass, que je veux faire des tests avec JUnit. La méthode publique, methodA, que je veux tester les appels à une méthode privée, methodB, dans la même classe pour déterminer le conditionnel chemin à suivre. Mon but est d'écrire des tests JUnit pour les différents chemins dans methodA. Aussi, methodB appels de service, donc je ne veux pas vraiment être exécuté quand je lance les tests JUnit.

Quelle est la meilleure façon de se moquer methodB et de contrôle de son retour afin que je puisse tester les différents chemins pour "methodA'?

Je préfère utiliser JMockit lors de l'écriture se moque, je suis donc particulièrement intéressé par la réponse qui s'applique à JMockit.

Voici mon exemple de classe:

public class MyClass  {

    public String methodA(CustomObject object1, CustomObject object2)  {

        if(methodB(object1, object2))  {
            //Do something.
            return "Result";
        }

        //Do something different.
        return "Different Result";

    }

    private boolean methodB(CustomObject custObject1, CustomObject custObject2)  {

        /* For the sake of this example, assume the CustomObject.getSomething()
         * method makes a service call and therefore is placed in this separate
         * method so that later an integration test can be written.
         */
        Something thing1 = cobject1.getSomething();
        Something thing2 = cobject2.getSomething();

        if(thing1 == thing2)  {
            return true;
        }
        return false;
    }

}

C'est ce que j'ai à ce jour:

public class MyClassTest  {
    MyClass myClass = new MyClass();

    @Test
    public void test_MyClass_methodA_enters_if_condition()  {
        CustomObject object1 = new CustomObject("input1");
        CustomObject object2 = new CustomObject("input2");

        // How do I mock out methodB here to return true?

        assertEquals(myClass.methodA(object1, object2), "Result");
    }

    @Test
    public void test_MyClass_methodA_skips_if_condition()  {
        CustomObject object1 = new CustomObject("input1");
        CustomObject object2 = new CustomObject("input2");

        // How do I mock out methodB here to return false?

        assertEquals(myClass.methodA(object1, object2), "Different Result");
    }

}

Merci!

Pour ce scénario, faites que la méthode de colis privé, c'est à dire "par défaut" spécificateur d'accès. Et j'utilise EasyMock#createMockBuilder() pour créer fantaisie partielle afin que je puisse se moquer de cette méthode privée. Ne sais pas d'équivalent pour votre JMockit.
Êtes-vous intéressé à la Easymock - Powermock solution? Sinon, je veux l'écrire pour vous.
Voir aussi stackoverflow.com/questions/250692/...
Voir aussi stackoverflow.com/questions/34571/...

OriginalL'auteur Kingand | 2013-10-31