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

Android Java单元测试:验证子类调用父类Activity方法

如何验证Android Activity子类调用父类方法的单元测试?

你的测试方式确实有问题,咱们来拆解下问题出在哪:

你现在的代码里,创建了两个完全独立的对象:一个是真实的MyActivity实例myActivity,另一个是单独mock出来的Activity spy对象mockActivity。当你调用myActivity.myMethod()时,执行的是这个实例自身继承的moveTaskToBack方法,和你那个单独的mockActivity没有任何关联——Mockito自然会告诉你“没有交互发生”,因为这俩根本不搭边。

正确的测试方式

要验证子类调用父类方法的行为,你需要spy你要测试的MyActivity实例,这样既能执行myMethod的真实逻辑,又能监控它调用父类方法的动作。

基础版测试代码如下:

@Test
public void testMyMethodCallsMoveTaskToBack() {
    // 创建MyActivity的spy对象,保留真实逻辑同时监控方法调用
    MyActivity myActivitySpy = Mockito.spy(new MyActivity());

    // 调用目标方法
    myActivitySpy.myMethod();

    // 验证spy对象上的moveTaskToBack方法是否被调用了1次,参数为false
    Mockito.verify(myActivitySpy, Mockito.times(1)).moveTaskToBack(false);
}

注意Android环境的坑

不过要提醒你:直接newActivity在纯JVM单元测试环境下大概率会报错,因为Android的Activity依赖系统上下文等框架资源。这时候推荐用Robolectric来模拟Android运行环境,让测试能正常执行:

@RunWith(RobolectricTestRunner.class)
public class MyActivityTest {

    @Test
    public void myMethod_shouldInvokeMoveTaskToBack() {
        // 用Robolectric创建并初始化MyActivity实例
        MyActivity myActivity = Robolectric.buildActivity(MyActivity.class)
                                          .create()
                                          .get();
        // spy这个经过初始化的实例
        MyActivity spyActivity = Mockito.spy(myActivity);

        // 调用方法
        spyActivity.myMethod();

        // 验证父类方法被调用
        Mockito.verify(spyActivity).moveTaskToBack(false);
    }
}

核心思路就是:你要监控的是你测试的那个MyActivity实例的方法调用,而不是一个完全无关的Activity mock对象。这样才能捕获到myMethod内部调用父类方法的行为。

内容的提问来源于stack exchange,提问作者hello_world

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:47:34