2013-07-19 5 views
11

テスト中のクラスで、他のクラスのモックイトをどのようにモックできますか?例えばテスト中のクラスのモッククラス

MyClass.java

class MyClass { 
    public boolean performAnything() { 
     AnythingPerformerClass clazz = new AnythingPerformerClass(); 
     return clazz.doSomething();   
    } 
} 

AnythingPerformerClass.java

class AnythingPerformerClass { 
    public boolean doSomething() { 
     //very very complex logic 
     return result; 
    } 
} 

とテスト:

@Test 
public void testPerformAnything() throws Exception { 
    MyClass clazz = new MyClass(); 
    Assert.assertTrue(clazz.performAnything()); 
} 

私はAnythingPerformerClass Fを偽装することはできますまたは不要なロジックをAnythingPerformerClassから除外しますか?単純返品trueまたはfalseの方法をdoSomething()の方法で上書きすることはできますか?

RobolectricでAndroidテストをするために必要なので、なぜ私はMockitoを指定しますか?

+0

なぜメソッドコールごとにクラスのインスタンスを1つインスタンス化するのですか?それは真剣に過剰に見える – fge

答えて

12

あなたはそれがdependency injectionを使用するようにMyClassをリファクタリングできます。代わりに、それはAnythingPerformerClassインスタンスを作成したのあなたはとても似MyClassのコンストラクタに、クラスのインスタンスに渡すことができます。

class MyClass { 

    private final AnythingPerformerClass clazz; 

    MyClass(AnythingPerformerClass clazz) { 
     this.clazz = clazz; 
    } 

    public boolean performAnything() {   
    return clazz.doSomething();   
    } 
} 
あなたはその後、ユニットテストでモック実装に渡すことができます

@Test 
public void testPerformAnything() throws Exception { 
    AnythingPerformerClass mockedPerformer = Mockito.mock(AnythingPerformerClass.class); 
    MyClass clazz = new MyClass(mockedPerformer); 
    ... 
} 

また、AnythingPerformerClassに状態が含まれている場合は、AnythingPerformerClassBuilderをコンストラクタに渡すことができます。

+0

[Mockito docs](http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#2)によると、プリミティブ 'boolean'のデフォルトの戻り値は'false'なので、このテストケースは失敗します。 – mthmulders

+0

さて、私はメソッド呼び出しが嘲笑されているステップを省略しました。 OPは "私はdoSomething()メソッドを単純または単純に返すことができますか?"だから私はコードを拘束すべきだとは思わない。 – cyon

1

あなたはMockitoで返すものを設定できます。

when(mock.method()).thenReturn(someValue) 
3

が現在メソッド内(0​​の宣言とインスタンスの両方であるように、それだけMockitoを用いAnythingPerformerClassを模擬することはできません。

可能であれば、宣言とAnythingPerformerClassのインスタンスの両方を移動させますクラスのレベルに:AnythingPerformerClassのインスタンス変数を宣言し、それをコンストラクタによってインスタンス化してください。

このようにして、テスト中にAnythingPerformerClassのモックを簡単に挿入し、動作を指定できます。十分な:

when(anythingPerformerClassMock.doSomething()).thenReturn(true); 

やエラー処理をテストするには:

when(anythingPerformerClassMock.doSomething()).thenTrow(new NullPointerException()); 
関連する問題