2013-01-07 6 views
7

Androidテストの初心者で、MockContextを使用してApplicationTestCaseを作成しようとしています(実際は名前変更コンテキストを使用しようとしています)。しかし、私はAssertionFailedErrorを得続けます。MockContextを使用したAndroid ApplicationTestCase

AppTests.java

package com.myProject.test; 

import android.test.ApplicationTestCase; 

public class AppTests extends ApplicationTestCase<MyApplication> { 
    public AppTests() { 
     super(MyApplication.class); 
    } 

    @Override 
    protected void setUp() throws Exception { 
     final RenamingMockContext mockContext = new RenamingMockContext(getContext()); 
     setContext(mockContext); 
     createApplication(); 
    } 

} 

MyApplication.java

package com.myProject.test; 

import android.app.Application; 

public class MyApplication extends Application { 

    public MyApplication() { 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

} 

RenamingMockContext.java

package com.myProject.test; 

import android.content.Context; 
import android.content.SharedPreferences; 
import android.test.RenamingDelegatingContext; 
import android.test.mock.MockContext; 

public class RenamingMockContext extends RenamingDelegatingContext { 

    private static final String PREFIX = "test."; 

    public RenamingMockContext(Context context) { 
     super (new DelegatedMockContext(context), PREFIX); 
     //super(context, PREFIX); 
    } 

    private static class DelegatedMockContext extends MockContext { 
     private Context mDelegatedContext; 
     public DelegatedMockContext(Context context) { 
      mDelegatedContext = context; 
     } 

     @Override 
     public String getPackageName() { 
      return mDelegatedContext.getPackageName(); 
     } 

     @Override 
     public SharedPreferences getSharedPreferences(
      String name, int mode) { 
      return mDelegatedContext.getSharedPreferences(
      PREFIX + name, mode); 
     } 

    } 

} 

障害トレース:

junit.framework.AssertionFailedError 
at android.test.ApplicationTestCase.setupApplication(ApplicationTestCase.java:102) 
at android.test.ApplicationTestCase.createApplication(ApplicationTestCase.java:118) 
at com.myApplication.test.AppTests.setUp(AppTests.java:14) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175) 
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555) 
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1710) 
0ここでは、これまで私の非常に基本的なコードです

メモ拡張されたMockContextクラスを使用しないで、コメントアウトされているRenamingMockContextコンストラクタで2番目のsuper()呼び出しを使用する場合、正常に動作します。

これは私のためにはうまくいかなかった参照UnsupportedOperationException while calling getSharedPreferences() from unit testであり、私はAndroid Application Testing Guideを読んでいます。これはまさにこのような例ですが、ソースをダウンロードして直接実行したとき、エラー。

+0

私はContextWrapperを拡張することによって、これを解決しました。私の答えはこちら - http://stackoverflow.com/a/19710382/201113 – barry

答えて

2

私は単純なコンテキストを模擬するためにAndroidTestCaseを使用しました。

class ExampleTest extends AndroidTestCase 
    public void setUp() { 
     Context c = new DelegatedMockContext(getContext()) 
    } 

    class DelegatedMockContext extends MockContext { 

    private Context mDelegatedContext; 
     private static final String PREFIX = "test."; 

     public DelegatedMockContext(Context context) { 
      mDelegatedContext = context; 
     } 

     @Override 
     public String getPackageName(){ 
      return PREFIX; 
     } 

     @Override 
     public SharedPreferences getSharedPreferences(String name, int mode) { 
      return mDelegatedContext.getSharedPreferences(name, mode); 
     } 
    } 
} 

そのちょうど沼地標準コンテキストが、あなたはApplicationTestCaseにAndroidデベロッパーガイドを確認し、その本のサンプルのための回避策として

4

を軌道に乗るだろう:「-があるとして、単にあなたのテストを実行した場合は、お使いのアプリケーションには完全に機能するコンテキストが挿入されます」(http://developer.android.com/reference/android/test/ApplicationTestCase.html)。

セットアップ方法の数行は、テスト作業を取得するためにコメントしている必要があります。

protected void setUp() throws Exception 
    { 
     super.setUp(); 
     // final RenamingMockContext mockContext = new RenamingMockContext(
     // getContext()); 
     // setContext(mockContext); 

     createApplication(); 
     mApplication = getApplication(); 
    } 
関連する問題