java - 如果单例类本身正在使用 PowerMock 进行测试,如何模拟该类的私有(private)方法?

标签 java unit-testing mocking mockito powermock

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

相关文章:

java - http 请求处理后未调用 postHandle 方法

java - 如何监控 Java 内存使用情况?

java - 对象实例化另一个对象?

mocking - 创建 Guzzle 客户端后将请求推送到 HandlerStack

javascript - 使用 Jest 测试跨浏览器扩展,如何模拟 Chrome 存储 API?

Python Mock 不断言调用

java - 使用迭代器删除时出现链接列表错误

java - JUnit 测试 - 错误的参数数量和@Parameter 字段

unit-testing - 由 QA 工程师进行的单元测试

python - 如何仅在测试类而不是单元测试用例中模拟函数