Se moquant privé méthodes utilisées dans la méthode publique avec PowerMock, Mockito, et TestNG

Je veux écrire un test unitaire pour une classe que j'ai. Cette classe possède une méthode publique, et à l'intérieur de la méthode publique il y a des appels à des méthodes privées dans la même classe. Je veux moquer des appels à ces méthodes privées. La classe est similaire à ceci:

public class SomeClass {
    public int somePublicMethod(int num) {
        int num2 = somePrivateMethod1(num);
        int num3 = somePrivateMethod2(num);

        return num2 + num3;
    }

    private int somePrivateMethod1(int num) {
        return 2*num;
    }

    private int somePrivateMethod2(int num) {
        return 3*num;
    }
}

Pour mon unité de test, je suis en train d'utiliser PowerMock avec Mockito et TestNG. Voici ma tentative de test qui teste somePublicMethod:

import static org.powermock.api.mockito.PowerMockito.doReturn;
import static org.powermock.api.mockito.PowerMockito.spy;

import org.powermock.core.classloader.annotations.PrepareForTest;
import org.testng.Assert;
import org.testng.annotations.Test;

@PrepareForTest(SomeClass.class)
public class SomeClassTest {

    @Test
    public void testSomePublicMethod() throws Exception {
        int num = 4;        

        SomeClass someClassSpy = spy(new SomeClass());

        doReturn(8).when(someClassSpy, "somePrivateMethod1", num);
        doReturn(12).when(someClassSpy, "somePrivateMethod2", num);

        int result = someClassSpy.somePublicMethod(num);

        Assert.assertEquals(result, 20);
    }
}

Lorsque j'exécute ce test, j'obtiens une exception et quelques conseils:

FAILED: testSomePublicMethod
org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here:
-> at org.powermock.api.mockito.internal.PowerMockitoCore.doAnswer(PowerMockitoCore.java:31)

E.g. thenReturn() may be missing.
Examples of correct stubbing:
    when(mock.isOk()).thenReturn(true);
    when(mock.isOk()).thenThrow(exception);
    doThrow(exception).when(mock).someVoidMethod();
Hints:
 1. missing thenReturn()
 2. you are trying to stub a final method, you naughty developer!

J'ai regardé quelques exemples en ligne, mais je n'ai pas trouvé un qui utilise PowerMock avec Mockito et TestNG spécifiquement à faire ce que je veux. Quelqu'un peut-il me donner quelques conseils sur ce que j'ai pu faire différemment?

OriginalL'auteur Thomas | 2012-05-09