PowerMockito 私有无效方法问题

PowerMockito private void method issue

我有以下class

class PowerMockitoTest{

  private void TestPrivateMethod(){
    System.out.println("Inside private method");
  }

  public void TestPublicMethod(){
    System.out.println("Inside public method");
    TestPrivateMethod();
  }
}

我创建了如下测试 class

@RunWith(PowerMockRunner.class)
public class PowerMockitoExampleTest {

@Test
public void test() throws Exception {

 PowerMockitoTest testclass = PowerMockito.spy(new PowerMockitoTest());
 PowerMockito.doNothing().when(testclass,"TestPrivateMethod");
 testclass.TestPublicMethod();

}

}

我得到的不是 'Inside public method' 的 OP,而是 'Inside private method' 的非常奇怪的 OP。尽管我已将私有方法存根以使其不执行任何操作,但它被调用以及 public 方法的 sysout 未被打印。

当我使用 PowerMockito.doAnswer() 时它工作正常,但它要求方法在包级别而不是私有级别。

这样写:

    PowerMockitoTest testclass = PowerMockito.spy(new PowerMockitoTest());
    try {
        PowerMockito.doNothing().when(testclass,  PowerMockito.method(PowerMockitoTest.class, "TestPrivateMethod")).withNoArguments();
    } catch (Exception e) {
        e.printStackTrace();
    }
    testclass.TestPublicMethod();

顺便说一句: 测试是关于模拟输入和调查输出(它可以是模块的状态、函数的结果或对另一个函数的调用)。

您不应该模拟私有方法,因为它们的结果不应该被视为输入,因为它们从外部是不可见的。

我认为您的代码中缺少的部分是@PrepareForTest 部分。您必须在@RunWith 注释

之后添加带有@PrepareForTest 的class 名称
@RunWith(PowerMockRunner.class)
@PrepareForTest({Class1.class, Class2.class})
public class ClassTest