Android ApplicationTestCase使用MockContext

我是Android测试的新手,我正在尝试使用MockContext创建一个ApplicationTestCase(实际上我正在尝试使用重命名模拟上下文)。 但我不断收到AssertionFailedError。 到目前为止,这是我的基本代码:

AppTests.java

package com.myProject.test; import android.test.ApplicationTestCase; public class AppTests extends ApplicationTestCase { 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); } } } 

失败追踪:

 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) 

请注意,如果我在注释掉的RenamingMockContext构造函数中使用第二个super()调用(所以不要使用扩展的MockContext类)它可以正常工作。

这是一个引用UnsupportedOperationException,同时从unit testing中调用getSharedPreferences(),这对我来说不起作用,我还阅读了Android应用程序测试指南这本书,它提供了一个完全相同的例子,但当我下载源代码并直接运行它时它给出了同样的错误。

    作为该书样本的解决方法,请查看ApplicationTestCase的android开发人员指南:“如果只是按原样运行测试,那么将为您的应用程序注入一个function齐全的上下文”( http://developer.android.com/reference) /android/test/ApplicationTestCase.html )。

    必须注释几行Setup方法才能使测试正常工作:

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

    我使用AndroidTestCase来模拟一个简单的上下文。

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

    它只是一个沼泽标准的上下文,但会让你去