この状況で?
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
ですか?
テスト上の理由でコンパクトなコードを変更したくありません。
実際、PowerMock を使用してオブジェクトの構築をモックできます。ここに優れたドキュメントがあります: https://code.google.com/p/powermock/wiki/MockConstructor
また、オブジェクトの構築をモックするこの例も見てください。
これを行うことができます。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
次に、これらのファクトリ メソッドをモックする a を使用できます。
Dependency Injectionが必要なようです。
B および C の具体的なインスタンスを作成しているため、動作を変更できません。
インスタンスを引数として にf(InterfaceB b, InterfaceC c)
渡します。ポリモーフィズムを利用する必要があります。その後、動作を変更する必要があるモック インスタンスを引数としてこのメソッドに渡すことができます。したがって、メソッドは、渡される具体的なインスタンスのタイプを気にする必要がなく、必要なものを達成できます。
インターフェイスの名前が非論理的であることは知っていますが、コンテキストを簡単に説明できます。