2013-01-07 8 views
7

Ich bin neu in Android-Tests und ich versuche, eine ApplicationTestCase mit einem MockContext zu erstellen (naja, eigentlich versuche ich eine Umbenennung Mock Context). Aber ich bekomme immer einen AssertionFailedError. Hier ist meine sehr grundlegenden Code so weit:Android ApplicationTestCase mit einem MockContext

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); 
     } 

    } 

} 

Failure Trace:

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) 

Hinweis: Wenn ich den zweiten Aufruf von super() im Konstruktor von RenamingMockContext verwende, der auskommentiert ist (also nicht die erweiterte MockContext-Klasse verwenden), funktioniert das problemlos.

Hier ist eine Referenz UnsupportedOperationException while calling getSharedPreferences() from unit test, die nicht für mich funktioniert, und ich lese auch durch das Buch Android Application Testing Guide, die ein Beispiel genau so gibt, aber wenn ich die Quelle heruntergeladen und direkt ausgeführt es gab das gleiche Error.

+0

Ich löste dies durch ContextWrapper erstreckt. Siehe meine Antwort hier - http://StackOverflow.com/a/19710382/201113 – barry

Antwort

2

Ich habe AndroidTestCase verwendet, um einen einfachen Kontext zu verspotten.

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); 
     } 
    } 
} 

Es ist nur ein Moor-Standard-Kontext, aber Sie werden

4

Als Abhilfe für dieses Buch Probe, überprüfen Sie die Android-Entwicklerhandbuch zu ApplicationTestCase los geht: „Wenn Sie einfach Ihre Tests ausführen, wie sie ist, Ihre Die Anwendung wird mit einem voll funktionsfähigen Kontext injiziert "(http://developer.android.com/reference/android/test/ApplicationTestCase.html).

Ein paar Zeilen der Setup-Methode muss den Test zum Laufen zu bringen kommentiert werden:

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

     createApplication(); 
     mApplication = getApplication(); 
    }