2016-07-26 3 views
0

私は、モックオブジェクト、特に自分の書いたクラスとSharedPreferencesモックでのテストに問題があります。私は関与しているアプリからコードスニペットを抽出し、何が起こっているのかを理解するためにそれを簡略化しました。Mockitoを使用したSharedPreferenceの動作の理解

私は私のプロジェクト内で、次のGradleの設定があります:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 24 
    buildToolsVersion "24.0.0" 

    defaultConfig { 
     applicationId "de.mk_xappo.mockitoexample" 
     minSdkVersion 19 
     targetSdkVersion 24 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    testCompile 'junit:junit:4.12' 
    testCompile 'org.mockito:mockito-core:1.10.19' 
    compile 'com.android.support:appcompat-v7:24.1.1' 
} 

をそして、私はここに、このクラスの持っている:

package de.mk_xappo.mockitoexample; 

import android.content.SharedPreferences; 


public class FeedbackManager { 

    protected static final String RATED = "RATED"; 

    private final SharedPreferences sharedPreferences; 


    public FeedbackManager(SharedPreferences sharedPreferences) { 
     this.sharedPreferences = sharedPreferences; 
    } 

    protected void setRated() { 
     sharedPreferences.edit().putBoolean(RATED, true).commit(); 
    } 

    protected boolean getRated() { 
     return sharedPreferences.getBoolean(RATED, false); 
    } 

    protected static boolean getTrue() { 
     return true; 
    } 

    public boolean getFalse() { 
     return false; 
    } 
} 

をそして、私は、このテストクラスがあります。

package de.mk_xappo.mockitoexample; 

import android.app.Application; 
import android.content.SharedPreferences; 

import org.junit.Assert; 
import org.junit.Test; 

import static org.mockito.Matchers.anyBoolean; 
import static org.mockito.Matchers.anyInt; 
import static org.mockito.Matchers.anyLong; 
import static org.mockito.Matchers.anyString; 
import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.when; 

public class FeedbackManagerTest { 

    private Application applicationMock; 
    private SharedPreferences preferencesMock; 
    private SharedPreferences.Editor editorMock; 
    private FeedbackManager feedbackManager; 

    @org.junit.Before 
    public void setUp() throws Exception { 
     applicationMock = mock(Application.class); 
     preferencesMock = mock(SharedPreferences.class); 

     when(applicationMock.getSharedPreferences(anyString(), anyInt())).thenReturn(preferencesMock); 

     editorMock = mock(SharedPreferences.Editor.class); 

     when(editorMock.putBoolean(anyString(), anyBoolean())).thenReturn(editorMock); 
     when(editorMock.putLong(anyString(), anyLong())).thenReturn(editorMock); 
     when(editorMock.remove(anyString())).thenReturn(editorMock); 
     when(preferencesMock.edit()).thenReturn(editorMock); 

//  feedbackManager = new FeedbackManager(preferencesMock); 
     feedbackManager = mock(FeedbackManager.class); 
    } 

    @Test 
    public void testBoolean() throws Exception { 
     Assert.assertTrue(FeedbackManager.getTrue()); 
     Assert.assertFalse(feedbackManager.getFalse()); 
    } 

    @Test 
    public void testSetRated() throws Exception { 
     boolean rated = feedbackManager.getRated(); 
     Assert.assertFalse(rated); 
     feedbackManager.setRated(); 

     rated = feedbackManager.getRated(); 

     when(preferencesMock.getBoolean(FeedbackManager.RATED, false)).thenReturn(false); 
     when(preferencesMock.getBoolean(FeedbackManager.RATED, false)).thenReturn(true); 

     Assert.assertFalse(rated); 
     Assert.assertTrue(rated); 
    } 
} 

今、私が理解していないことは、私が実行すると、すべてtestBoolean()は期待どおりに動作するということです。しかし、私がtestSetRated()を実行すると、ではなく、が期待どおりに動作します。彼らは反対しているものの

ためどちらwhen(preferencesMock.getBoolean(FeedbackManager.RATED, false)).thenReturn(false);when(preferencesMock.getBoolean(FeedbackManager.RATED, false)).thenReturn(true);は失敗します。

そしてAssert.assertFalse(rated);を動作し、Assert.assertTrue(rated);を失敗した理由を私は理解していません。これは他の方法で行われます。

多分私はモック、特にSharedPreferencesモックの使い方を誤解していますか?または何がうまくいかないのですか?

答えて

0

私は実際にwhen(mock.method()).thenReturn(value)の仕組みを誤解しました。それは何もチェックしません。 mockオブジェクトは、次回にmethod()が呼び出された場合には、valueを返さなければなりません。 testSetRated()メソッドは、SharedPreferencesが記述されているかどうかを調べることによってもテストできます。その後、すべてが期待通りに機能します。

関連する問題