【问题标题】:PowerMock complains of incorrect arguments even though the private method is mocked即使私有方法被模拟,PowerMock 也会抱怨参数不正确
【发布时间】:2015-07-17 14:55:40
【问题描述】:

我正在尝试 PowerMock,并尝试像这样模拟私有方法:

expectPrivate(n, "doLogin", anyString(), anyString()).andReturn(true);

也就是说,我希望truedoLogin 返回,而与传递的参数无关。 委托给这个私有方法的公共方法只是简单地传递参数。这是要模拟的类的定义:

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

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

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)

因此,当特定的 Strings 传递给 public login() 方法时,模拟框架并不满意,但在使用 anyString 时很好。理想情况下,我希望由于对 private doLogin 的调用是模拟的,因此不应该是这种情况。 我错过了什么?

【问题讨论】:

  • @Pratik,我已经用它更新了问题
  • 如果这不是问题,你能发布你的整个测试课程吗?我在这里看不到任何问题
  • @Pratik,没问题,再次更新。

标签: java unit-testing mockito powermock easymock


【解决方案1】:

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

根据您的导入,您使用的是Mockito Matchers,而不是EasyMock Matchers:org.mockito.Matchers.anyString

您能否尝试为下一个更改匹配器:EasyMock.anyString()

import org.easymock.EasyMock;

...

expectPrivate(n, "doLogin", EasyMock.anyString(), EasyMock.anyString()).andReturn(expected);

希望对你有帮助。

【讨论】:

  • 像魅力一样工作!谢谢!虽然我不明白为什么。
  • 此链接比较了两者(Mockito v/s EasyMock),并声称匹配器是相同的。 code.google.com/p/mockito/wiki/MockitoVSEasyMock
  • 老实说,我不明白为什么......我还认为我们可以使用 Mockito Matchers。甚至我认为这是一个错误。无论如何,很高兴为您提供帮助!
  • 所以我能找到的唯一区别是 EasyMock.anyString() 返回一个 null,而 Mockito 的 anyString() 返回一个空白 ("")。
猜你喜欢
  • 1970-01-01
  • 2018-10-19
  • 2015-02-20
  • 2014-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
相关资源
最近更新 更多