2016-05-15 3 views
2

クラスAの関数func1をテストしています。テスト対象のクラスから呼び出される単体テストのメソッドをオーバーライドする方法

Func1はクラスBのローカル変数を持ち、Bの関数func2を呼び出します。コードは次のようになります。

public Class A 
{ 
    public func1() 
    { 
     B object = new B(); 
     int x = object.func2(something); 
    } 
} 

単体テストでfunc1をテストしているときに、func2が呼び出されないようにします。

だから私はテストでこのような何かをしようとしています:

B textObject = new B() 
{ 
    @override 
    int func2(something) 
    { 
     return 5; 
    } 
} 

しかし、それはまだこれを処理する方法を提案してくださいクラスBの関数func2を呼び出しています。

+1

は、あなたが引数として 'B'を取るために、依存性注入、リファクタリング 'A'を使用することができます関数内に 'new'を作成するのではなく?このような抽象的な例では、分かりやすいアドバイスをするのは難しいです。 – jonrsharpe

+0

私はAのコンストラクタでBを入力としてfunc1の入力として受け取ることはできません。クラスAのfunc1をオーバーライドしているためです。 BをAのクラス変数として作成できますが、それは役に立たないようですどちらか。この場合、あなたは何をお勧めしますか? –

+1

問題の内容がわかりません。再び、この例はあまりにも抽象的です。 DIについていくつかの調査を行います。 – jonrsharpe

答えて

2

new B()コンストラクタをオーバーライドする場合は、独自のメソッドで呼び出します。

public Class A 
{ 

    public func1() 
    { 
     B object = newB(); 
     int x = object.func2(something); 
    } 

    protected B newB(){ 
     return new B(); 
    } 
} 

テストでは、Bコンストラクタコールを上書きできます。

public class APartitialMock extends A { 

    protected B newB(){ 
     return new BMock(); 
    } 
} 

public class BMock extends B { 

    int func2(something) { 
     return 5 
    } 

} 

その後Bのあなたの一種でfunc1をテストするためにAPartitialMockを使用しています。

PSすることができますかpowermockを見てみましょうフレームワークを使用する場合 - Mock Constructor

+0

私はこのスロー依存性注入を解決しましたが、これは大きなアドバイスです!ありがとう! –

0

私はAのクラス変数としてBを作ることができるが、それはどちらか を助けていないようです。この場合、あなたは何をお勧めしますか?

あなたはクラス変数としてBを作る場合、あなたはBを模擬することができ、およびA.
の検査対象の「スワップ」それを多分非常にエレガントな、しかし迅速かつ簡単ではありません。

例:

public class B { 
    int func2(int something){ 
     return 3*something; 
    } 
} 

public class A 
{ 
    // declare it as protected - a test need to have access to this field to replace it 
    protected B object = new B(); 

    public int func1() 
    { 
     int x = object.func2(22); 
     return x; 
    } 
} 

とテスト:

import static org.mockito.Mockito.*; 
import static org.junit.Assert.*; 

import org.junit.Test; 

public class ATest { 

    @Test 
    public void test() { 
     A myA = new A(); 
     B myB = mock(B.class); 

     // dummy function 
     when(myB.func2(anyInt())).thenReturn(20); 

     // replace B with mocked B 
     myA.object = myB; 

     int actual = myA.func1(); 

     assertEquals(20, actual); 
    } 
} 
関連する問題