2016-03-19 20 views
1

私はMyClassというクラスを持っています。私はそのクラスのメソッドを持っています、public int getSpacing()Mockitoを使って、インスタンスメソッドの戻り値をそのクラスのインスタンスを持たずにどうやって模擬することができますか?

私は別のクラスのメソッドをテストしています。 public static ArrayList<SpecialObject> getSpecialObjects()

getSpecialObjects()MyClassのインスタンスでgetSpacing()を呼び出します。私はMockitoでテストを実行しているときにこのメソッドが常に0を返すようにしたい。これどうやってするの?私が見つけたすべての例では、メソッドをモックする前にオブジェクトの特定のインスタンスが必要です。

これは私が行う方法です。

MyClass myInstance = new MyClass();   
Mockito.when(myInstance.getSpacing()).thenReturn(0); 

はしかし、私はインスタンスがgetSpecialObjects()で動的に作成されるため、MyClassのすべてのインスタンスのgetSpacing()の動作をオーバーライドします。これどうやってするの?

これは私が言いたいことですが、どのようにわからないのですか。

Mockito.when((Any instance of MyClass).getSpacing()).thenReturn(0); 
+0

'初期化する必要がmyInstance'。あなたのコードを表示できますか? –

+0

@JaredBurrows例を修正しました。これは私のコードのダウンバージョンです。私の問題は、私はインスタンスにアクセスする必要がない、私はすべてのインスタンスの動作をオーバーライドしたいです。 –

+0

私はそれが可能であるとは思わない、あなたが必要な場所で虚偽のインスタンスを注入する可能性がありますか? –

答えて

1

説明したようにMockitoでは純粋にこれを行うことはできません。 Mockitoは、MyClass型のすべてのオブジェクトを制御するのではなく、を制御できる代理サブクラスを作成してインスタンス化することを非常に簡単にします。このため、Mockitoはクラスとメソッドが重要ではないと評価し、Mockitoを使用してすべてのインスタンスの動作に影響を与えることができない理由を説明します。

も参照してください:How to use Mockito when we cannot pass a mock object to an instance of a class

回避策の一つは、ライブラリを切り替えることです:As Slava describes、あなたは彼らがあなたを返すことができるようにnew MyClass()コンストラクタへの呼び出しを置き換える含まれるバイトコードを変更するカスタムクラスローダを持ってPowerMockを、使用することができます代わりにモック。

代わりに、テストを簡単にするためにクラスを再構成することができます。あなたは完全に依存性の注入のためのクラスを構築し、Provider<MyClass>を注入したが、恩恵のほとんどは、よりローカルな解決策がありますができます

public class ClassThatConsumesMyClass { 
    /** Visible for testing. Override to customize MyClass instances. */ 
    MyClass createMyClass() { 
    return new MyClass(); 
    } 

    public ReturnValue getSpecialObjects(int n) { 
    for (int i = 0; i < n; i++) { 
     // Instead of calling "new MyClass()", call your method. 
     MyClass myClassInstance = createMyClass(); 
     // ... 
    } 
    // ... 
    } 
} 

public class TestForClassThatConsumesMyClass { 
    ClassThatConsumesMyClass consumer; 

    @Before public void createMyClass() { 
    consumer = new ClassThatConsumesMyClass() { 
     @Override MyClass createMyClass() { 
     MyClass myInstance = Mockito.mock(MyClass.class); 
     Mockito.when(myInstance.getSpacing()).thenReturn(0); 
     return myInstance; 
     } 
    } 
    } 

    // Test as usual, now that you've mocked every newly-created 
    // instance of MyClass in your consumer. 
} 
1

あなたはそうのようなpowermockを使用してMyClassコンストラクタを模擬することができます

MyClass myClassSpy = spy(new MyClass()); 
whenNew(MyClass.class).withAnyArguments().thenReturn(myclassSpy); 

その後、あなたはスパイの通常のオーバーライドを使用して、そのメソッドから何が好き返すことができます。 PrepareForTestを忘れないでくださいMyClass

関連する問題