如何使用Powermock模拟常规方法

时间:2013-09-24 06:02:57

标签: java mockito easymock powermock

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

例如

int getYear() {
    return 2013;
}

在测试中我可以设置如下内容:

expect(getYear()).andReturn(2012);

// class underTest

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

我想模仿部分getResponseX.getDimensions()返回21。

1 个答案:

答案 0 :(得分:1)

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

class Foo{
    int F(){
        return 42;
    }
}

你嘲笑它:

Foo fooMock = EasyMock.createMock(Foo.class);
EasyMock.expect(fooMock.F()).andReturn(41);

您的案例中需要模拟整个

链的问题
client.newServiceCall().call().getResponseX()

为此,您可能需要更改班级最初获得client引用的方式。 E.G,在构造函数中或通过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创建一个模拟并将其传递给被测试类的构造函数。这样您就可以完全控制方法ProxyB.getDimensions中返回的内容。从这一点开始,你就可以嘲笑调用链(是的,这是很多嘲讽)。最终,getResponseX局部变量应包含您的模拟,您可以设置任何期望。