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
相关产品推荐
相关产品推荐

