2016-06-23 4 views
0

私はMockitoにはとても新しいので、解決策が見つからない状況があります。私はMockitoを使ってテストしたいメソッドがあります。問題は、このメソッドの内部にオブジェクトが作成されていて、そのオブジェクトには私が嘲笑したい機能があることです。外部からアクセスできないオブジェクトに属するメソッドを偵察するには?

だから、たとえば、ここに私の問題を示して、小さなサンプルコードです:MyTestFunction()でそう

public class ClassA { 
    public functionDoingDBStuff() { 
     //........... 
    } 
} 

public class ClassB { 
    final ClassA classAObj = null; 

    public functionXYZ() { 
     classAObj = new ClassA(); 

     classAObj.functionDoingDBStuff(); 
    } 
} 


@Test 
MyTestFunction() { 
    ClassB classBObj = new ClassB(); 

    // How can I access and mock functionDoingDBStuff() here? 
} 

、私はfunctionXYZ()をテストしたいのですが、functionXYZ()内部で呼び出される関数functionDoingDBStuff()をモック。モックでは、私がテストに必要な特定の結果を返すことを意味します。しかし、functionDoingDBStuff()functionXYZ()の内部に作成されたオブジェクトに属しているので、私はMockitoにMyTestFunction()からアクセスするようにどのように伝えることができるのか分かりません。私はあなたが私の言いたいことを理解できることを願っています。

+0

これは、オブジェクトが依存関係自体を作成してはならない理由です。代わりに、[dependency inversion](https://en.wikipedia.org/wiki/Dependency_inversion_principle)を使用してください。 – Seelenvirtuose

+0

'ClassA'を嘲笑しない*。注[単体テスト](http://martinfowler.com/bliki/UnitTest.html)では、嘲笑は必要ありません。 –

答えて

0

コードの構造に問題があることを示すコードを簡単にテストすることができない場合は私に。とにかく、functionXYZ内で新しいClassA()を実行する必要があるのはなぜですか?オブジェクトレベルでインスタンス化することはできません。もしそうなら、ClassAのモックインスタンスを挿入することができます。

まだメソッド内でインスタンス化する必要がある場合は、新しいClassA()を実行する代わりに、ファクトリメソッド内にラップする必要があります。次に、模擬ClassAを返すために工場を模擬することができます。

関連する問題