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)
假设我的申请 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)