私が持っているクラスの単体テストを書きたいです。このクラスにはパブリック メソッドがあり、パブリック メソッド内には、同じクラスのプライベート メソッドへの呼び出しがあります。これらのプライベート メソッドの呼び出しをモックしたいと考えています。クラスは次のようになります。
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;
}
}
私の単体テストでは、Mockito と TestNG で PowerMock を使用しようとしています。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);
}
}
このテストを実行すると、例外といくつかのヒントが表示されます。
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!
オンラインでいくつかの例を見てきましたが、PowerMock と Mockito および TestNG を使用して、特に私がやりたいことを行う例は見つかりませんでした。私が別の方法でできることについて、誰かが私にいくつかの指針を与えることができますか?