【问题标题】:Android ApplicationTestCase using a MockContext使用 MockContext 的 Android ApplicationTestCase
【发布时间】:2013-01-07 22:46:29
【问题描述】:

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

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

}

重命名MockContext.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 while calling getSharedPreferences() from unit test,它对我不起作用,我还通读了 Android 应用程序测试指南这本书,它给出了一个完全一样的例子,但是当我下载源代码并直接运行它时,它给出了同样的错误。

【问题讨论】:

标签: android unit-testing mocking android-context


【解决方案1】:

作为该书示例的解决方法,请查看 Android 开发人员指南 ApplicationTestCase:“如果简单地按原样运行测试,您的应用程序将被注入一个功能齐全的上下文”(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();
    }

【讨论】:

    【解决方案2】:

    我使用 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);
            }
        }
    } 
    

    它只是一个沼泽标准上下文,但会让你继续前进

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多