2013-01-07 10 views
7

Jestem nowy w testowaniu Androida i staram się stworzyć ApplicationTestCase za pomocą MockContext (a właściwie staram się używać Renaming Mock Context). Ale wciąż otrzymuję AssertionFailedError. Oto mój bardzo prosty kod do tej pory:Android ApplicationTestCase za pomocą 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); 
     } 

    } 

} 

Awaria Ślad:

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) 

Uwaga: jeśli używam drugiego wywołania super() w konstruktorze RenamingMockContext, który jest zakomentowany (nie używaj rozszerzonej klasy MockContext), działa poprawnie.

Oto odniesienie UnsupportedOperationException while calling getSharedPreferences() from unit test, które nie działało dla mnie, a także przeczytałem podręcznik Android Application Testing Guide, który podaje przykład dokładnie taki jak ten, ale po pobraniu źródła i uruchomieniu go bezpośrednio dało to samo błąd.

+0

Rozwiązałem to przez rozszerzenie ContextWrapper. Zobacz moją odpowiedź tutaj - http://stackoverflow.com/a/19710382/201113 – barry

Odpowiedz

2

Użyłem AndroidTestCase do kpiny z prostego kontekstu.

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

jej tylko bog standardowy kontekst, ale będzie Ci będzie

4

Jako obejście dla tej próbki książek, sprawdź android podręczniku programisty i ApplicationTestCase: „Jeśli po prostu uruchomić swoje testy jak jest twój Aplikacja zostanie wstrzyknięta w pełni funkcjonalny kontekst "(http://developer.android.com/reference/android/test/ApplicationTestCase.html).

Kilka wierszy metody instalacji należy skomentował dostać pracy badawczej:

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

     createApplication(); 
     mApplication = getApplication(); 
    } 
Powiązane problemy