Android真机使用Mockito-1.10.19+Dexmaker-1.2在Mock仅包内可见类时报告错误“java.lang.UnsupportedOperationException: cannot proxy inaccessible class ***”

Android真机使用Mockito-1.10.19+Dexmaker-1.2Mock仅包内可见类时报告如下错误:

被测试类代码如下:

注意上述被测试类前面没有声明public,因此默认是default访问,也就是包内可见。我们下面的测试代码跟被测试类属于同一个包名package com.yunos.tv.shake.biz,因此,按理说,是可以正常访问的。
测试类的代码如下:

这个问题只在ART虚拟机下面发生异常,相同的代码在Dalvik下面是完全正常的。
问题发生的原因暂时还不能确定,应该是ART虚拟机实现功能的时候的不兼容导致的。
解决方法为在测试代码中声明一个继承被测试类的子类,并且把子类声明成public
如下:

修改后的测试代码如下:

即可解决上述问题。

Android ContentProvider使用时出现的错误“java.lang.SecurityException: Permission Denial: opening provider ***”

AndroidAPK上自定义了一个ContentProvider,但是在调用者使用时出现的错误"java.lang.SecurityException: Permission Denial: opening provider ***"。

查询了半天才发现是由于在声明ContentProvider的时候没有声明android:exported="true"导致的。

从目前的测试情况来看,跟Android的版本有关系,目前看到在低版本的Android系统上面,这个如果不设置,默认是自动导出的,但是在高版本的Android上面,默认就是不导出了,这就导致一个问题,就是相同的APK在不同系统上面会出现不同的行为。因此要求必须显示指定这个字段

注意如下说明:

参考链接


Android真机使用Mockito-1.10.19+Dexmaker-1.2在Mock继承抽象父类的子类时报告错误“java.lang.AbstractMethodError: abstract method not implemented”

Android真机使用Mockito-1.10.19+Dexmaker-1.2Mock继承抽象父类的子类时报告如下错误:

父类代码如下:

子类代码如下:

测试代码如下:

在项目的build.gradle中的声明如下:

这个问题只在Dalvik虚拟机下面发生异常,相同的代码在ART下面是完全正常的。
导致问题发生的原因是Google提供的dexmaker库存在BUG导致的,而这个库,从Maven Center上看,自从2012年开始就没有提供过任何的更新了。
解决方法是不使用Google提供的dexmaker,而是使用com.crittercism.dexmaker修正过这个BUG的版本。

com.crittercism.dexmaker项目的GitHub地址是https://github.com/crittercism/dexmaker