如果我正在为Singleton类编写单元测试,那么我该如何模拟Singleton类的私有方法。我正在寻找的方案的示例代码段如下: -
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;}
}
如何在上面的例子中模拟method2来测试method1?
答案 0 :(得分: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时,主要使用模拟,在这种情况下,Singleton与其他组件(协作者)隔离,以确保其行为正确。在这种情况下,没有必要。
何时可以使用模拟
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));
}