Java 如何使用Powermock模拟常规方法

Java 如何使用Powermock模拟常规方法,java,mockito,easymock,powermock,Java,Mockito,Easymock,Powermock,在groovy中,我能够在测试中将方法的期望返回值设置为我想要的任何值。我可以使用PowerMock模拟常规方法吗 例如 int getYear() { return 2013; } 在测试中,我可以设置如下内容: expect(getYear()).andReturn(2012); //被测班级 class ProxyB { public X getDimensions(){ GetResponseX getResponseX = client.newSer

在groovy中,我能够在测试中将方法的期望返回值设置为我想要的任何值。我可以使用PowerMock模拟常规方法吗

例如

int getYear() {
    return 2013;
}
在测试中,我可以设置如下内容:

expect(getYear()).andReturn(2012);
//被测班级

class ProxyB {
    public X getDimensions(){
        GetResponseX getResponseX = client.newServiceCall().call().getResponseX();
        int d = getResponseX.getDimensions();
    }
}

我想模拟部件
getResponseX.getDimensions()
以返回21。

这是模拟简单调用的基本代码。鉴于以下类别:

class Foo{
    int F(){
        return 42;
    }
}
你嘲笑它:

Foo fooMock = EasyMock.createMock(Foo.class);
EasyMock.expect(fooMock.F()).andReturn(41);
在您的案例中,问题是您需要模拟整个

client.newServiceCall().call().getResponseX()
为此,您可能需要更改类最初获取对
client
的引用的方式。 例如,在构造函数中或通过setter方法获取它。它可能大致类似于:

class ProxyB{
    YourClient client;

    ProxyB(YourClient client){
        this.client = client;
    }

    public X getDimensions(){
        GetResponseX getResponseX = client.newServiceCall().call().getResponseX();
        int d = getResponseX.getDimensions();
    }
}

现在,在编写单元测试时,为
YourClient
创建一个mock,并将其传递给被测试类的构造函数。这样,您就可以完全控制它从方法
ProxyB.getDimensions
中返回的内容。从这一点上,您可以沿着调用链进行模拟(是的,这是很多模拟)。最后,
getResponseX
局部变量应该包含您的mock,您可以对其设置任何期望值。

我们需要更多详细信息,如果方法是静态的或最终的,您需要Powermock。否则Easymock将完成这项工作。它不是静态的或最终的,但我正在测试定义此方法的类,因此我无法模拟该对象