如果我正在为 Singleton 类编写单元测试,那么我该如何模拟 Singleton 类的私有(private)方法。我正在寻找的场景的示例代码片段如下:-
Class Singleton {
private static Singleton instance = new Singleton();
protected Singleton() {}
public Singleton synchronized getInstance() { return instance;}
public int method1(int a) {
int ret = method2(a);
return ret;
}
private int method2(int num) { return num + 1;}
}
如何模拟方法2以测试上面示例中的方法1?
最佳答案
要测试method1
,您只需像测试任何其他方法一样测试它。在本例中,不应模拟被测试的对象 Singleton 类。
创建一个测试对象,即您的被测类(被测试者),通常在设置方法中创建:
@Test
public void testMethod1() {
int testValue = 1;
int expectedResult = 2;
assertThat(testee.method1(testValue), equalTo(expectedResult));
}
在上面的示例中,我将使用 JUnitParams 之类的参数化测试来测试边界,例如 Integer MAX_VALUE 等。
@Test
@Parameters(method = "method1Params")
public void testMethod1(int testValue, int expectedResult) {
assertThat(testee.method1(testValue), equalTo(expectedResult));
}
@Ignore
private final Object[] method1Params() {
return new Object[] {
new Object { 1, 2 },
new Object { -2, -1 }
};
}
模拟主要用于测试 SUT 时,在本例中,单例与其他组件(协作者)隔离,以确保其行为正确。在这种情况下,没有必要。
什么时候可以使用模拟
public int method1(DependedOnComponent doc) {
int a = 1;
int ret = doc.method2(a);
return ret;
}
然后
@Test
public void testMethod1() {
DependedOnComponent mockDOC = mock(DependedOnComponent.class);
// When method2() is called you control the value returned
when(mockDOC.method2(1)).thenReturn(2);
assertThat(testee.method1(mockDOC), equalTo(2));
}
关于java - 如果单例类本身正在使用 PowerMock 进行测试,如何模拟该类的私有(private)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26097367/