Android - 仪器测试期间应用程序的模拟方法

Android - Mock method of Application during instrumented test

假设我的申请 class 如下所示:

import android.app.Application;

public class MyApp extends Application {

    public String example(){
        return "Test";
    }

}

我有一些仪器测试用于测试 UI。假设我有以下测试:

public class MyMainActivityTest {

    @Rule
    public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(
            MainActivity.class);

    @Test
    public void firstTest(){
       onView(withId(R.id.textBt)).perform(click());
       // ...
    }
}

我想在 MyMainActivityTest 中模拟 example() 方法,假设它应该 return Mock Test 而不是 Test。怎么做?

您应该创建 Class 来扩展您的 Application class 并将其放入测试文件夹。

    public class MyTestApp extends MyApp {

    public String example(){
        return "SuperTest";
    }
}

然后在你的测试中使用 @Config 来自 Robolectric 库的注解 class:

@Config(application = MyTestApp)

这应该适用于所有类型的测试,包括 Espresso UI 测试,如果不是,您可以尝试将自定义 TestRunner 与您的 TestApp class 一起使用,例如 :

public class MyRunner extends AndroidJUnitRunner {
  @Override
  public Application newApplication(ClassLoader cl, String className, Context context)
      throws Exception {
    return super.newApplication(cl, MyTestApp.class.getName(), context);
  }
}

然后把它放在你的测试中 class: @RunWith(MyRunner.class)