【问题标题】:How to mock a regular method using Powermock如何使用 Powermock 模拟常规方法
【发布时间】:2013-09-25 03:22:28
【问题描述】:

在 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。

【问题讨论】:

  • 我们需要更多细节,如果方法是静态或最终的,你需要Powermock。否则 Easymock 将完成这项工作。
  • 它不是静态的或最终的

标签: java mockito easymock powermock


【解决方案1】:

这是模拟简单调用的基本代码。给定以下类:

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 创建一个模拟并将其传递给被测类的构造函数。这样,您就可以完全控制它从方法 ProxyB.getDimensions 中返回的内容。从这一点开始,您将沿着调用链向下模拟(是的,它有很多模拟)。最终,getResponseX 局部变量应该包含您的模拟,您可以对其设置任何期望。

【讨论】:

  • 但我正在测试定义此方法的类,因此我无法模拟该对象
猜你喜欢
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多