【发布时间】:2018-11-06 14:11:17
【问题描述】:
在使用 Mockito 运行 Espresso 测试时,我目前遇到这个问题,即在主 Activity 启动后,"Attempt to read from the field 'int android.content.pm.ApplicationInfo.targetSdkVersion' on a null object reference" 异常随机出现。
这是主Activity的初始化部分:
private MainActivity subject;
SingleActivityFactory<MainActivity> activityFactory =
new SingleActivityFactory<MainActivity>(MainActivity.class) {
@Override
protected MainActivity create(Intent intent) {
subject = spy(getActivityClassToIntercept());
return subject;
}
};
@Rule public ActivityTestRule<MainActivity> mainActivityRule =
new ActivityTestRule<>(activityFactory, true, false);
@Before
public void init() {
mainActivityRule.launchActivity(null);
}
这是个例外:
java.lang.NullPointerException: Attempt to read from field 'int
android.content.pm.ApplicationInfo.targetSdkVersion' on a null object
reference
at android.view.View.getLayoutDirection(View.java:10277)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:446)
at android.view.View.measure(View.java:23169)
at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1059)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:141)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535
Test running failed: Instrumentation run failed due to 'Process crashed.'
还有崩溃的logcat:
2018-11-06 15:34:50.391 3299-3299/com.application.android E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.application.android, PID: 3299
java.lang.NullPointerException: Attempt to read from field 'int android.content.pm.ApplicationInfo.targetSdkVersion' on a null object reference
at android.view.View.getLayoutDirection(View.java:10277)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:446)
at android.view.View.measure(View.java:23169)
at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1059)
at android.view.View.measure(View.java:23169)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
这里的问题是这个问题并不一致 - 失败率约为 40%。有人对这个问题有任何见解吗? 另外,我应该提到,如果在没有使用 Mockito 监视 Activity 的情况下启动了 Activity,则不会出现此问题。
更新:
通过在 View.java 类中引入更改解决了该问题:
@ResolvedLayoutDir
public int getLayoutDirection() {
//added check if ApplicationInfo is not null
if(getContext().getApplicationInfo() == null){
View v = this;
Log.i("View id: ", getContext().getString(v.getId()));
Log.e("Main error", "Bug catched");
}
else {
final int targetSdkVersion = getContext().getApplicationInfo().targetSdkVersion;
if (targetSdkVersion < Build.VERSION_CODES.JELLY_BEAN_MR1) {
mPrivateFlags2 |= PFLAG2_LAYOUT_DIRECTION_RESOLVED;
return LAYOUT_DIRECTION_RESOLVED_DEFAULT;
}
}
return ((mPrivateFlags2 & PFLAG2_LAYOUT_DIRECTION_RESOLVED_RTL) ==
PFLAG2_LAYOUT_DIRECTION_RESOLVED_RTL) ? LAYOUT_DIRECTION_RTL : LAYOUT_DIRECTION_LTR;
}
不修改系统类是否可以达到类似的效果?
【问题讨论】:
-
你在代码中使用
getFragmentManager()方法吗?还有@Datenshi -
是的,我在几个地方这样做
-
请添加解决方案as an answer,而不是将其添加到问题中。您也可以accept your own answer,但您必须等待 48 小时才能这样做。
标签: android mockito android-espresso