2013-05-06 28 views
5

私は以下のクラスを持っている:PowerMockito:コンストラクタによって呼び出されたメソッドをモックする方法は?

public class Foo { 

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

} 

私は、彼らが実際に行うことは何もまたは他の何かをしない作るためinitField1()initField3()を(モックする)動作を変更する必要があります。私はinitField2()の実際のコードを実行することに興味があります。私は、次の試験書きたい

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

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

initField()の方法はもちろんプライベートです。

どうすればいいですか?

ご協力いただきありがとうございます。

答えて

-1

あなたがしたいことに何か問題があると思います。

私が理解する限り、MockitoやPowerMockなどの模擬フレームワークは、テスト中のオブジェクトとその依存関係とのやりとりを模擬するためのものです。

私はあなたの質問を理解しているので、あなたはオブジェクトの動作の一部を模擬し、残りの部分をテストしたいと思っています。あなたのケースでは

、あなたはこれらのためにあなたがinitField1()initField3を呼び出すにしたくない理由がある場合initField2()initField1()initField3()

への呼び出しなしで呼び出されませんよう、決して起こらない何かをテストしたいですメソッドが他のオブジェクトやファイルシステムやDBとやりとりする場合は、コンストラクタの引数や注釈付きセッタを介して依存関係を注入し、テスト用のモックを挿入するだけです。また、依存関係を適切に設定してオブジェクトをインスタンス化するには、FactoryパターンやBuilderパターンを使用するか、SpringやGoogle Guiceなどの依存関係注入フレームワークを使用します。

彼らはあなたのオブジェクト内の異なるビジネスロジックを扱うので、あなたD'ONTはinitField1()initField3を呼びたい理由がある場合は、単一責任の原則を破壊している、とあなたがすべきのように、これは(http://martinfowler.com/books/refactoring.htmlのように)においリファクタリング。

+0

これは従来のコードです。私は、例えば、引数を受け入れる新しいコンストラクタを書くことによって、テスト中のクラスを変更しないことを好みます。 'initField2()'は、テストしたいフィールドを設定する責任があるので、実行するだけです。私はコンストラクタのロジックの残りの部分をテストするのは面白くない。 –

+0

Mockitoは相互作用を模擬するためのもので、PowerMockはレガシーコード用のクラスの部分的な内部動作を模擬しているため、この答えは間違っているだけです。 – eis

5

何も:)あなたはまだhttp://code.google.com/p/powermock/wiki/SuppressUnwantedBehavior

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(); 
    } 
} 

に記載された方法をSUPRESSするPowerMockを使用することができ、あなたはクラスを要因に、再あなたはそれのために十分なテストカバレッジを持っている必要があります後にレガシーコードに発生する可能性が考慮。

+0

ありがとうございました。それは今働きます! さらにもう1つの質問ですが、 'initField2()'が呼ばれたことをどうやって確認するのですか? 私は私の新しいFooのスパイについて思ったが、verifyPrivate(FOO).invoke(initField2)は ''助けにはならないので、それとの対話は実際にはありません。 –

+0

@JulienCollah 'foo.myGet()'が正しい値を返すことを間接的にテストします。 –

関連する問題