在这种情况下?
class A {
public void f() {
B b = new B();
C c = new C();
// use b and c, and how to modify their behaviour?
}
}
如何通过PowerMock
和EasyMock
实现我的想法?
出于测试原因,我不想更改我的紧凑代码。
答案 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接口。