细数Android Studio中使用junit4测试框架中的坑

  • build.gradle中添加依赖
dependencies {
    compile 'com.android.support:appcompat-v7:23.2.1'
    testCompile 'junit:junit:4.12'
}
  • 添加以下,使用模拟环境代替真实环境
android {
    testOptions { 
        unitTests {
            returnDefaultValues = true
        }
    }
}
  • Android Studio中不需要在清单文件中配置 instrumentation 和 uses-library
  • 测试代码主体部分(此方法也是趴Stack Overflow之中N久才得到的,感谢感谢)
public class TestBlackNumberDao extends ActivityTestCase{

    public void testAdd() {
        BlackNumberDAO dao = new BlackNumberDAO(getInstrumentation().getContext() );
        boolean result = dao.insertDao("1888", "2");
        assertEquals(true, result);
    }
}

注意上面代码继承的是 ActivityTestCase ,获取上下文使用的是 getInstrumentation().getContext() ,使用这个方法完全可以获得测试结果。

  • 这里介绍坑之所在(调试好久才得到结果,惭愧惭愧)
public class TestBlackNumberDao extends AndroidTestCase{

    public void testAdd() {
        BlackNumberDAO dao = new BlackNumberDAO(getContext() );
        boolean result = dao.insertDao("1888", "2");
        assertEquals(true, result);
    }
}

上面代码是很多资料上写的方式,eclipse中完全可以使用上面所用得到测试结果,不过在Android Studio中会出现一个问题,那就是getContext()方法会返回null,即根本得不到上下文context,结果就是报出空指针异常bug。


源码分析

  • 先介绍坑,即 AndroidTestCase 的 getContext()
public void setContext(Context context) {
    mContext = context;
}

public Context getContext() {
    return mContext;
}

查看源码可以得到上述部分,得知mContext由setContext方法进行赋值,但是没有一个地方有调用setContext方法,所以getContext方法的返回值自然就是null了。

  • 成功方法,即ActivityTestCase 的 getInstrumentation().getContext()
public Context getContext() {
    return mInstrContext;
}       
                                //初始化时获得了Context
final void init(ActivityThread thread, Context instrContext, Context appContext, ComponentName component, IInstrumentationWatcher watcher, IUiAutomationConnection uiAutomationConnection) {
     mThread = thread;
     mMessageQueue = mThread.getLooper().myQueue();
     mInstrContext = instrContext;   //here is context
     mAppContext = appContext;
     mComponent = component;
     mWatcher = watcher;
     mUiAutomationConnection = uiAutomationConnection;
 }

上述源码清晰的说明了context赋值的过程,所以这种方式可以获得context值

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值