Android ApplicationTestCase使用MockContext

odi*_*ity 7 android unit-testing mocking android-context

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

}
Run Code Online (Sandbox Code Playgroud)

MyApplication.java

package com.myProject.test;

import android.app.Application;

public class MyApplication extends Application {

    public MyApplication() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

}
Run Code Online (Sandbox Code Playgroud)

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

    }

}
Run Code Online (Sandbox Code Playgroud)

失败追踪:

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)
Run Code Online (Sandbox Code Playgroud)

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

这里是一个参考UnsupportedOperationException异常,同时呼吁从单元测试getSharedPreferences()这并没有为我工作,我也通过这本书Android应用程序测试指南这正是给了这样一个例子看,但是当我下载的源和直接运行它它给出了同样的错误.

Mik*_*keB 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);
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

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