如果类本身正在使用PowerMock进行测试,如何模拟Singleton类的私有方法?

时间:2014-09-29 10:07:58

标签: java unit-testing mocking mockito powermock

如果我正在为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?

1 个答案:

答案 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));
}