2017-07-20 10 views
5

mockMapは実際の実装を使用しているのはなぜですか? これを防止するにはどうすればよいですか?テストを実行する場合0:実際の実装を使用したMockitoモックオブジェクト

when(mockMap.keySet().toArray()[0])... 

には、ArrayIndexOutOfBoundsExceptionをスローtestFirstKeyMatch方法において

MaxSizeHashMapは、私はにもっと入れしようとしたとき ははIndexOutOfBoundsExceptionをスローし、7の最大サイズとのLinkedHashMapです。

プロファイルは、これに必須ではないものを追跡します。

SuperClass.java

public class SuperClass { 

protected String[] days; 
protected MaxSizeHashMap<String, String> map; 

public SuperClass() { 
    days = new String[7]; 
    map = new MaxSizeHashMap<String, String>(); 
    //... 
} 

void updateDays() { 

    cal = Calendar.getInstance(); 

    for (int i = 0; i < 7; i = i + 1) { 

     //adds short names "Mon", "Tue", ... to days 
     days[i] = cal.getDisplayName(Calendar.DAY_OF_WEEK, 
       Calendar.SHORT, Locale.US); 

     cal.add(Calendar.DATE, 1); 
    } 
} 

void firstKeyMatch(Profile profile) { 

    updateDays(); 

    //checks if first key of map is not same as days[0] 
    if (days[0] != map.keySet().toArray()[0]) { 

     profile.add(); 

     //... 
    } 
} 
} 

SuperClassTest.java

@RunWith(MockitoJUnitRunner.class) 
public class SuperClassTest { 

@InjectMocks 
private SuperClass spr = new SuperClass(); 

@Mock 
private MaxSizeHashMap<String, String> mockMap; 

@Mock 
private Profile mockProfile; 

//... 

@Test 
public void testFirstKeyMatch() { 

    when(mockMap.keySet().toArray()[0]).thenReturn(spr.days[0]); 

    verify(mockProfile, never()).add(); 

} 
} 
+1

この 'とき(mockMap.keySet())を試してみてください。 thenReturn(new HashSet(Arrays.asList( "your day string"))); 'あなたの日の文字列をあなたがテストしている値に置き換えます。 – Abubakkar

+1

実際の実装ではありません、mocksはデフォルト値を返します。 'keySet()'の場合は空のコレクションです。 – Jonathan

答えて

3

、モックのためmockitoの暗黙の動作はdefault valuesを返すことです。

デフォルトでは、値を返すすべてのメソッドに対して、モックはnull、プリミティブ/プリミティブラッパー値、または空のコレクションを適切に返します。たとえば、int/Integerの場合は0、ブール値/ブール値の場合はfalseです。その結果で

、あなたのmockMap.keySet()あなたは、空の配列に変換し、(存在しない)最初の要素、それゆえIOOBEを取得しようと、空のハッシュセットを返します。結論として

debugger

、mockitoは、実際の実装を使用していないが、それがになっていて、それが正常に動作しています。

SuperClassのコンストラクタ全体をポストしていませんが、おそらくマップをインスタンス化した後に値を設定することもあります。それが本当であれば、実際には最初の要素が得られているので、例外は実際には実装が使われていないという証拠であると主張することができます。

ソリューションについては

、うまくすでにあなたが(クレジットAbubakkarに行く)が必要ですどんなデータで設定した独自のハッシュを返すことが示唆されています:

when(mockMap.keySet()).thenReturn(new HashSet(Arrays.asList("your day string"))); 
1

spr.days[i]にすべてmockMap.keySet().toArray()[i]のコールをリダイレクトするには、誰かがキーセットを要求した場合days配列を返すmockMapを伝えることができます。 documentation 1として

Set keySetMock = mock(Set.class); 
when(keySetMock.toArray()).thenReturn(spr.days); 
when(mockMap.keySet()).thenReturn(keySetMock); 
関連する問題