Android ApplicationTestCase using a MockContext
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
odiggity
Updated on June 08, 2022Comments
-
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.