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
我有以下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