2013-01-07 10 views
7

Sono nuovo per i test di Android e sto provando a creare un ApplicationTestCase utilizzando un MockContext (beh, in realtà sto tentando di utilizzare un Rename Mock Context). Ma continuo a ricevere un AssertionFailedError. Ecco il mio codice molto semplice finora:Android ApplicationTestCase che utilizza un 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); 
     } 

    } 

} 

Fallimento 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) 

Nota se utilizzo la seconda chiamata super() nel costruttore RenamingMockContext che è commentato (quindi non utilizzare la classe estesa di MockContext) funziona correttamente.

Ecco un riferimento UnsupportedOperationException while calling getSharedPreferences() from unit test che non ha funzionato per me, e ho anche letto il libro di Android Application Testing Guide che fornisce un esempio esattamente come questo, ma quando ho scaricato l'origine e l'ho eseguito direttamente ha dato lo stesso errore.

+0

I risolto questo estendendo ContextWrapper. Vedi la mia risposta qui - http://stackoverflow.com/a/19710382/201113 – barry

risposta

2

Ho utilizzato AndroidTestCase per prendere in giro un semplice contesto.

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

Il suo solo un contesto bog standard, ma sarà farti andare

4

Come soluzione alternativa per quel campione libro, controllare la guida per gli sviluppatori Android per ApplicationTestCase: "Se è sufficiente eseguire i test così come sono, la vostra L'applicazione verrà iniettata con un contesto completamente funzionale "(http://developer.android.com/reference/android/test/ApplicationTestCase.html).

Poche righe del metodo di installazione deve essere commentati per ottenere il funzionamento di prova:

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

     createApplication(); 
     mApplication = getApplication(); 
    } 
Problemi correlati