Android ApplicationTestCase using a MockContext

16,477

Solution 1

As a workaround for that book sample, check the android developer guide to ApplicationTestCase: "If simply run your tests as-is, your Application will be injected with a fully-functional Context" (http://developer.android.com/reference/android/test/ApplicationTestCase.html).

A few lines of the Setup method must be commented to get the test working:

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

        createApplication();
        mApplication = getApplication();
    }

Solution 2

I've used AndroidTestCase to mock a simple context.

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

Its just a bog standard Context, but will get you going

Share:
16,477
odiggity
Author by

odiggity

Updated on June 08, 2022

Comments

  • odiggity
    odiggity about 2 years

    I'm new to Android testing and I'm trying to create an ApplicationTestCase using a MockContext (well actually I'm trying to use a Renaming Mock Context). But I keep getting an AssertionFailedError. Here's my very basic code so far:

    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)
    

    Note if I use the second super() call in the RenamingMockContext constructor that is commented out (so don't use the extended MockContext class) it works fine.

    Here is a reference UnsupportedOperationException while calling getSharedPreferences() from unit test which didn't work for me, and I also read through the book Android Application Testing Guide which gives an example exactly like this, but when I downloaded the source and ran it directly it gave the same error.