Espresso测试unmarshalling阶段出现ClassNotFoundException问题咨询
问题根因
该异常仅在Espresso测试场景下触发的核心原因是:
- Espresso运行时使用的Instrumentation上下文类加载器,与应用自身的类加载器相互独立
- 系统反序列化
SavedInstanceState内的Parcelable对象时,默认会优先使用Instrumentation的类加载器,无法找到AppCompat组件、自定义View等应用内的类,因此抛出ClassNotFoundException - 手动操作时全程使用应用自身的类加载器,所以不会触发该问题
解决方案
最优方案是在Activity调用super.onCreate前,给SavedInstanceState手动设置应用自身的类加载器,不会丢失任何页面状态,完全不需要删除状态存储条目,修改示例如下:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { if(savedInstanceState != null) { // 手动设置应用类加载器,解决Espresso下反序列化找不到类的问题 savedInstanceState.setClassLoader(getClass().getClassLoader()); } super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.open_button).setOnClickListener(v -> startActivity(new Intent(MainActivity.this, ChildActivity.class))); } }
如果项目存在统一的Activity基类,直接将上述逻辑加到基类的onCreate方法中,即可一次性解决所有Activity的同类问题。
内容的提问来源于stack exchange,提问作者Mike Hall
相关产品推荐
相关产品推荐

