2

この状況で?

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ですか?

テスト上の理由でコンパクトなコードを変更したくありません。

4

4 に答える 4

4

実際、PowerMock を使用してオブジェクトの構築をモックできます。ここに優れたドキュメントがあります: https://code.google.com/p/powermock/wiki/MockConstructor

また、オブジェクトの構築をモックするこの例も見てください。

于 2013-04-09T14:08:09.590 に答える
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次に、これらのファクトリ メソッドをモックする a を使用できます。

于 2013-04-09T07:21:55.107 に答える
0

Dependency Injectionが必要なようです

B および C の具体的なインスタンスを作成しているため、動作を変更できません。

インスタンスを引数として にf(InterfaceB b, InterfaceC c)渡します。ポリモーフィズムを利用する必要があります。その後、動作を変更する必要があるモック インスタンスを引数としてこのメ​​ソッドに渡すことができます。したがって、メソッドは、渡される具体的なインスタンスのタイプを気にする必要がなく、必要なものを達成できます。

インターフェイスの名前が非論理的であることは知っていますが、コンテキストを簡単に説明できます。

于 2013-04-09T07:13:22.230 に答える