Java 当我使用doReturn(..)时,PowerMockito正在调用该方法
我是PowerMockito的新手,它显示了一种我不理解的行为。以下代码解释了我的问题:Java 当我使用doReturn(..)时,PowerMockito正在调用该方法,java,mockito,powermockito,Java,Mockito,Powermockito,我是PowerMockito的新手,它显示了一种我不理解的行为。以下代码解释了我的问题: public class ClassOfInterest { private Object methodIWantToMock(String x) { String y = x.trim(); //Do some other stuff; } public void methodUsingThePrivateMethod() { Object a = new O
public class ClassOfInterest {
private Object methodIWantToMock(String x) {
String y = x.trim();
//Do some other stuff;
}
public void methodUsingThePrivateMethod() {
Object a = new Object();
Object b = methodIWantToMock("some string");
//Do some other stuff ...
}
}
我有一个类,它包含一个我想模拟的私有方法,名为methodIWantToMock(String x)
。在我的测试代码中,我将执行以下操作:
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassOfInterest.class)
public class ClassOfInterestTest {
@Test
public void someTestMethod() {
ClassOfInterest coiSpy = PowerMockito.spy(new ClassOfInterest());
PowerMockito.doReturn(null).when(coiSpy, "methodIWantToMock", any(String.class));
coiSpy.methodUsingThePrivateMethod();
//Do some stuff ...
}
}
根据上面的代码,当我运行上面的测试时,只要在
方法内部调用methodiWantomock
,PowerMockito就应该简单地返回一个null。然而,实际发生的情况是,当运行此命令时:PowerMockito.doReturn(…)。当(…)
时,PowerMockito实际上正在调用methodIWantToMock
它为什么这样做??在这个阶段,我只想指定在调用coiSpy.methodUsingThePrivateMethod()时,当调用私有方法时,它应该如何模拟私有方法代码>行已经运行。所以我想出了一个适合我的解决方案。我没有使用spy
,而是使用了mock
,然后告诉PowerMockito在我的模拟对象中调用methodUsingThePrivateMethod()
时调用real方法。它基本上做了与以前相同的事情,只是使用了mock
而不是spy
。这样,PowerMockito就不会调用我试图使用PowerMockito.doReturn(…).when(…)
控制其行为的私有方法。这是我修改过的测试代码。我更改/添加的行被标记为:
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassOfInterest.class)
public class ClassOfInterestTest {
@Test
public void someTestMethod() {
//Line changed:
ClassOfInterest coiMock = PowerMockito.mock(new ClassOfInterest());
//Line changed:
PowerMockito.doReturn(null).when(coiMock, "methodIWantToMock", any(String.class));
//Line added:
PowerMockito.when(coiMock.methodUsingThePrivateMethod()).thenCallRealMethod();
coiSpy.methodUsingThePrivateMethod();
//Do some stuff ...
}
}
您正在模拟对象上使用tePrivateMethod()
调用方法,而模拟对象又在内部调用methodiWantomock(“某些字符串”)
。您在这里期望的是什么行为?这是正确的,但是通过调试,我发现当我运行doReturn().when()命令时,PowerMockito调用methodIWantToMock()
。它不会等待方法usingtheprivateMethod()
调用它。我通过调试发现了这种行为。如果我运行测试(不进行调试),测试会崩溃,因为当doReturn(…)时会生成NullPointerException
。当执行(…)
命令时,PowerMockito会在传递null
作为输入的同时运行私有方法,当字符串y=x.trim()时也是如此代码>在方法内部执行,使用pPrivateMethod()
,将生成NullPointerException
。底线===命令coiSpy.methodUsingThePrivateMethod()从未调用代码>。对于此行:PowerMockito.doReturn(null)。when(coiMock,“methodIWantToMock”,any(String.class));//coiMock不能调用methodIWantToMock,对吗?