5

私は次のクラスを持っています:

public class Foo {

  public Foo() {
     initField1();
     initField2();
     initField3();
  }

}

initField1()私は(モックするために)動作を変更する必要がありinitField3()ます。initField2() の実際のコードを実行することに興味があります。

次のテストを書きたい:

Foo foo = new Foo();
assertTrue(foo.myGet());

myGet()によって計算された Foo の属性を返しますinitField2()

メソッドはinitField()もちろん非公開です。

どうすればそのようなことができますか?

ご協力いただきありがとうございます。よろしくお願いいたします。

4

2 に答える 2

5

レガシーコードで何かが起こる可能性があることを考慮して:) http://code.google.com/p/powermock/wiki/SuppressUnwantedBehaviorPowerMockで説明されているように、メソッドを抑制するために使用できます

import static org.powermock.api.support.membermodification.MemberMatcher.methods;
import static org.powermock.api.support.membermodification.MemberModifier.suppress;

@RunWith(PowerMockRunner.class)
@PrepareForTest(Foo.class)
public class FooTest {

    @Test
    public void testSuppressMethod() throws Exception {
        suppress(methods(Foo.class, "initField1", "initField3"));
        Foo foo = new Foo();
    }
}

それでも、十分なテスト カバレッジが得られたら、クラスをリファクタリングする必要があります。

于 2013-05-07T07:58:41.230 に答える
-1

あなたのやりたいことが間違っていると思います。

私の知る限り、Mockito や PowerMock などのモック フレームワークは、テスト対象のオブジェクトとその依存関係の間の相互作用をモックすることを目的としています。

あなたの質問を理解しているので、オブジェクトの動作の一部をモックし、残りをテストしたいと考えています。

あなたの場合、決して起こらない何かをテストしinitField2()たいinitField1().initField3()

initField1()を呼び出したくない理由initField3が、これらのメソッドが他のオブジェクト、ファイルシステム、または DB と対話するためである場合は、コンストラクター引数または注釈付きセッターを介して依存関係を注入し、テスト用にモックを注入する必要があります。また、依存関係を適切に設定してオブジェクトをインスタンス化するには、ファクトリ パターンやビルダー パターンを使用するか、Spring や Google Guice などの依存性注入フレームワークを使用することをお勧めします。

呼び出したくない理由が、オブジェクト内のさまざまなビジネス ロジックを処理するためである場合、これは ( http://martinfowler.com/books/refactoring.html のように) シングルを壊しているようににおいinitField1()ます責任の原則、およびリファクタリングする必要があります。initField3

于 2013-05-06T19:29:11.717 に答える