即使模拟了私有方法,PowerMock也抱怨参数不正确

pug*_*arx 5 java unit-testing easymock mockito powermock

我正在尝试PowerMock,并且正在尝试模拟如下私有方法:

expectPrivate(n, "doLogin", anyString(), anyString()).andReturn(true);
Run Code Online (Sandbox Code Playgroud)

也就是说,无论传递什么参数,我都希望true从中返回doLogin。委托给此私有方法的public方法只是传递参数。这是要模拟的类的定义:

class N {
        public boolean login(String username, String password) {
            return doLogin(username, password);
        }
        private boolean doLogin(String u, String p){
            //validate login
            //...
            //...
            return true;
        }
     }
Run Code Online (Sandbox Code Playgroud)

这是我试图调用模拟的测试类:

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);
   }
}
Run Code Online (Sandbox Code Playgroud)

这是故障跟踪:

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)
Run Code Online (Sandbox Code Playgroud)

因此,当将特定的Strings传递给public login()方法时,模拟框架不会感到高兴,而在anyString使用时会很好。理想情况下,我希望由于对的调用private doLogin是模拟的,所以事实并非如此。我想念什么?

tro*_*oig 3

我遇到了类似的问题,我认为您的问题可能出在anyString()通过参数传递给 PowerMockexpectPrivate方法的匹配器中。

根据您的导入,您正在使用MockitoMatchers 而不是EasyMockMatchers: org.mockito.Matchers.anyString

您可以尝试更改下一个匹配器吗:EasyMock.anyString()

import org.easymock.EasyMock;

...

expectPrivate(n, "doLogin", EasyMock.anyString(), EasyMock.anyString()).andReturn(expected);
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。

  • 所以我能发现的唯一区别是 EasyMock.anyString() 返回 null,而 Mockito 的 anyString() 返回空白 ("")。 (3认同)