You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:18:02