PowerMock 抱怨不正确的参数,即使私有方法被模拟
PowerMock complains of incorrect arguments even though the private method is mocked
我正在试用 PowerMock,并且正在尝试像这样模拟一个私有方法:
expectPrivate(n, "doLogin", anyString(), anyString()).andReturn(true);
也就是说,我希望 true
从 doLogin
返回,而不考虑传递的参数。
委托给这个私有方法的 public 方法只是传递参数。这是要模拟的 class 的定义:
class N {
public boolean login(String username, String password) {
return doLogin(username, password);
}
private boolean doLogin(String u, String p){
//validate login
//...
//...
return true;
}
}
这是测试 class 我试图调用模拟的地方:
import static org.junit.Assert.assertEquals;
import static org.powermock.api.easymock.PowerMock.createPartialMock;
import static org.powermock.api.easymock.PowerMock.expectPrivate;
import static org.powermock.api.easymock.PowerMock.replay;
import static org.powermock.api.easymock.PowerMock.verify;
import static org.mockito.Matchers.anyString;
import org.easymock.EasyMock;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.reflect.Whitebox;
@RunWith(PowerMockRunner.class)
@PrepareForTest(N.class)
public class NodeAccessorTest {
private String username = "admin";
private String password = "asdf";
@Test
public void testMockLogin() throws Exception {
N n = createPartialMock(N.class,
"doLogin", String.class, String.class);
boolean expected = true;
expectPrivate(n, "doLogin", anyString(), anyString()).andReturn(expected);
replay(n);
boolean actual = n.login("A", "B");
verify(n);
assertEquals("Expected and actual did not match", expected, actual);
}
}
这是故障痕迹:
java.lang.AssertionError:
Unexpected method call N.doLogin("A", "B"):
N.doLogin("", ""): expected: 1, actual: 0
at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:44)
at org.powermock.api.easymock.internal.invocationcontrol.EasyMockMethodInvocationControl.invoke(EasyMockMethodInvocationControl.java:91)
at org.powermock.core.MockGateway.doMethodCall(MockGateway.java:124)
at org.powermock.core.MockGateway.methodCall(MockGateway.java:185)
at com.pugmarx.mock.N.doLogin(N.java)
at com.pugmarx.mock.N.login(N.java:60)
因此,当特定的 String
传递给 public login()
方法时,模拟框架不满意,但在使用 anyString
时很好。理想情况下,我希望由于对 private doLogin
的调用被模拟,所以情况不应如此。
我错过了什么?
我遇到了类似的问题,我认为您的问题可能出在参数传递给 PowerMock expectPrivate
方法的 Matchers anyString()
中。
根据您的导入,您使用的是 Mockito
匹配器 EasyMock
匹配器:org.mockito.Matchers.anyString
.
您能否尝试更改下一个匹配器:EasyMock.anyString()
import org.easymock.EasyMock;
...
expectPrivate(n, "doLogin", EasyMock.anyString(), EasyMock.anyString()).andReturn(expected);
希望对您有所帮助。
我正在试用 PowerMock,并且正在尝试像这样模拟一个私有方法:
expectPrivate(n, "doLogin", anyString(), anyString()).andReturn(true);
也就是说,我希望 true
从 doLogin
返回,而不考虑传递的参数。
委托给这个私有方法的 public 方法只是传递参数。这是要模拟的 class 的定义:
class N {
public boolean login(String username, String password) {
return doLogin(username, password);
}
private boolean doLogin(String u, String p){
//validate login
//...
//...
return true;
}
}
这是测试 class 我试图调用模拟的地方:
import static org.junit.Assert.assertEquals;
import static org.powermock.api.easymock.PowerMock.createPartialMock;
import static org.powermock.api.easymock.PowerMock.expectPrivate;
import static org.powermock.api.easymock.PowerMock.replay;
import static org.powermock.api.easymock.PowerMock.verify;
import static org.mockito.Matchers.anyString;
import org.easymock.EasyMock;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.reflect.Whitebox;
@RunWith(PowerMockRunner.class)
@PrepareForTest(N.class)
public class NodeAccessorTest {
private String username = "admin";
private String password = "asdf";
@Test
public void testMockLogin() throws Exception {
N n = createPartialMock(N.class,
"doLogin", String.class, String.class);
boolean expected = true;
expectPrivate(n, "doLogin", anyString(), anyString()).andReturn(expected);
replay(n);
boolean actual = n.login("A", "B");
verify(n);
assertEquals("Expected and actual did not match", expected, actual);
}
}
这是故障痕迹:
java.lang.AssertionError:
Unexpected method call N.doLogin("A", "B"):
N.doLogin("", ""): expected: 1, actual: 0
at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:44)
at org.powermock.api.easymock.internal.invocationcontrol.EasyMockMethodInvocationControl.invoke(EasyMockMethodInvocationControl.java:91)
at org.powermock.core.MockGateway.doMethodCall(MockGateway.java:124)
at org.powermock.core.MockGateway.methodCall(MockGateway.java:185)
at com.pugmarx.mock.N.doLogin(N.java)
at com.pugmarx.mock.N.login(N.java:60)
因此,当特定的 String
传递给 public login()
方法时,模拟框架不满意,但在使用 anyString
时很好。理想情况下,我希望由于对 private doLogin
的调用被模拟,所以情况不应如此。
我错过了什么?
我遇到了类似的问题,我认为您的问题可能出在参数传递给 PowerMock expectPrivate
方法的 Matchers anyString()
中。
根据您的导入,您使用的是 Mockito
匹配器 EasyMock
匹配器:org.mockito.Matchers.anyString
.
您能否尝试更改下一个匹配器:EasyMock.anyString()
import org.easymock.EasyMock;
...
expectPrivate(n, "doLogin", EasyMock.anyString(), EasyMock.anyString()).andReturn(expected);
希望对您有所帮助。