如何在java中模拟局部变量?

时间:2013-04-09 07:11:09

标签: java mocking easymock powermock

在这种情况下?

class A {
  public void f() {
    B b = new B();
    C c = new C();
    // use b and c, and how to modify their behaviour?
  }
}

如何通过PowerMockEasyMock实现我的想法?

出于测试原因,我不想更改我的紧凑代码。

4 个答案:

答案 0 :(得分:4)

事实上,您可以使用PowerMock模拟对象构造。他们在这里有很好的文档:https://code.google.com/p/powermock/wiki/MockConstructor

另请查看this example,其中介绍了模拟对象构造。

答案 1 :(得分:1)

您可以这样做,请参阅Matt Lachman的回答。但是,不推荐这种方法。这有点蠢。

最好的方法是将依赖对象的创建委托给工厂模式,并将工厂注入A类:

class BFactory {

    public B newInstance() {
        return new B();
    }
}

class CFactory {

    public C newInstance() {
        return new C();
    }
}

class A {

    private final BFactory bFactory;
    private final CFactory cFactory;

    public A(final BFactory bFactory, final CFactory cFactory) {
        this.bFactory = bFactory;
        this.cFactory = cFactory;
    }

    public void f() {
        B b = bFactory.newInstance();
        C c = cFactory.newInstance();
    }
}

然后,您将模拟工厂以返回依赖类的模拟实例。

如果由于某种原因这不可行,那么您可以在A

中创建工厂方法
class A {

    public void f() {
        B b = newB();
        C c = newC();
    }

    protected B newB() {
        return new B();
    }

    protected C newC() {
        return newC();
    }
}

然后你可以使用嘲笑那些工厂方法的spy

答案 2 :(得分:0)

您似乎需要 Dependency Injection

您正在创建 B和C的具体实例,然后您无法修改该行为。

将实例作为参数传递给f(InterfaceB b, InterfaceC c),您应该使用多态,然后您可以传递一个模拟实例,您需要将其行为更改为此方法的参数。因此,该方法不需要关心传递给它的哪种类型的具体实例,并且您可以实现所需。

我知道接口的名称不合逻辑,但可以很容易地解释上下文。

答案 3 :(得分:0)

如果不更改代码,它将无法正常工作。 (可测试性设计)。 您可以使用工厂方法替换B,该方法创建实际的B1或最佳测试,两者都实现IB接口。