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

Android测试:Mockito与Espresso自定义MockApplication配置问题

解决Mockito+Espresso测试中的配置问题

嘿,别担心新手问题太基础——谁都是从踩坑过来的😉 先帮你揪出最显眼的一个问题:你定义的ActivityTestRule泛型是OnboardActivity,但构造参数却传了MainActivity.class,这俩类型不匹配,肯定会导致编译或者运行时错误,先把这个统一过来:
如果要测试OnboardActivity,就写成:

@Rule
public ActivityTestRule<OnboardActivity> mActivityTestRule = new ActivityTestRule<>(OnboardActivity.class);

如果目标是MainActivity,就把泛型改成MainActivity就行。

接下来,聊聊怎么让测试正确使用你创建的MockApplication、MockApplicationComponent和MockApplicationModule:

1. 给MockApplication添加测试注解

在你的MockApplication类上加上AndroidX Test的@TestApplication注解,这样测试运行时会自动使用这个Mock应用替代真实的Application:

import androidx.test.annotation.TestApplication;

@TestApplication
public class MockMyApp extends Application {
    private MockApplicationComponent component;

    @Override
    public void onCreate() {
        super.onCreate();
        // 初始化Mock Dagger组件,替代真实的ApplicationComponent
        component = DaggerMockApplicationComponent.create();
    }

    // 提供全局访问组件的方法,方便测试中注入Mock依赖
    public MockApplicationComponent getComponent() {
        return component;
    }
}

2. 正确编写测试类的Setup方法

在@Before注解的setup方法里,你可以获取MockApplication实例,并且配置Mockito的Mock对象(如果需要替换依赖的话)。这里给你一个完整的测试类示例:

import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.rule.ActivityTestRule;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withId;

@RunWith(AndroidJUnit4.class)
public class OnboardActivityTest {
    // 修正后的ActivityTestRule
    @Rule
    public ActivityTestRule<OnboardActivity> mActivityTestRule = new ActivityTestRule<>(OnboardActivity.class);

    // 声明需要Mock的依赖(比如你的ApiService、Repository等)
    @Mock
    private ApiService mockApiService;

    @Before
    public void setup() {
        // 初始化Mockito注解
        MockitoAnnotations.openMocks(this);

        // 获取MockApplication实例
        MockMyApp mockApp = (MockMyApp) getInstrumentation().getTargetContext().getApplicationContext();
        
        // 如果你的MockApplicationModule支持替换依赖,这里可以把mock对象注入进去
        // 或者在MockApplicationModule里直接提供Mock实例:
        // @Provides
        // ApiService provideApiService() {
        //     return Mockito.mock(ApiService.class);
        // }
    }

    @Test
    public void testOnboardNextButton() {
        // Espresso测试示例:点击下一步按钮,检查欢迎文本是否显示
        onView(withId(R.id.btn_next)).perform(click());
        onView(withId(R.id.tv_welcome)).check(matches(isDisplayed()));
    }
}

3. 检查依赖配置

确保你的app模块build.gradle里添加了必要的测试依赖:

dependencies {
    // Espresso核心依赖
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
    // AndroidX Test JUnit集成
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    // Mockito Android版(支持Android环境的Mock)
    androidTestImplementation 'org.mockito:mockito-android:5.6.0'
    // 如果用Dagger,别忘了添加Dagger的测试依赖
    androidTestImplementation 'com.google.dagger:dagger-android-testing:2.48'
}

如果之后还是遇到具体的错误(比如编译报错、运行时崩溃的日志),可以把错误信息贴出来,我再帮你排查~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:14:33