我无法使用Espresso进行仪器测试。 我有一个活动,当应用程序启动时(主要活动)弹出帐户选择器。 如果客户点击取消(在对话框中),则会再次弹出选择器;如果用户点击添加,则会在活动结果中获取结果。
我不知道如何使用espresso创建一个简单的测试,其中包括该选择器。 当我使用MainActivity创建Instrumentation测试时,我得到了以下消息: 阶段没有活动重新开始...
public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity>{
MainActivity myActivity;
public MainActivityTest(){
super(MainActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
getActivity();
}
public void testAccountPicker(){
onView(withText("Choose an account")).check(matches(isDisplayed()));
}
}
有人有类似的问题吗?
Thanx提前给出答案。
答案 0 :(得分:3)
这是一个艰难的:)。这里的问题是,一旦流程离开您的应用程序(Google帐户选择器是外部应用程序),Espresso就会结束测试。帐户选择器是包com.google.android.gms
中的活动,因此是外部活动。一旦启动,您的测试就完成了,您将永远无法匹配对话框中的任何内容。
您有三种可能的解决方案可以让您的测试变得可行:
我将展示如何使用类路径替换。这个技术非常简单:你应该在一个单独的类中隔离你的Intent创建,比如说IntentsFactory
,并且在测试期间覆盖那个类。
说你的工厂在com.yourapp.factories.IntentsFactory
,它是这样的:
public class IntentsFactory {
public static Intent getAccountPickerIntent (Context context) {
return AccountPicker.newChooseAccountIntent(null, null, new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, true, null, null, null, null);
}
}
你应该在你的测试应用程序(比如它是com.yourapp.tests
)中创建一个具有相同名称和方法的包,但是它会返回一个不同的Intent,一个模拟的/虚拟的:
public class IntentsFactory {
public static Intent getAccountPickerIntent (Context context) {
return new Intent(context, MyDummyAccountPickerActivity.class);
}
}
每当您的测试执行时,它们将使用类路径中的“最近”类,即测试中的IntentsFactory。而不是返回将流程发送到另一个应用程序的意图,流程将转到您的项目的一个类,Espresso将不会结束测试。
这里唯一需要注意的是,你必须创建MyDummyAccountPickerActivity
,它将返回一个结果,并Bundle
类似于框架类返回的结果。活动应存在于您应用的清单中,您必须指示您的模拟器Dalvik运行时允许使用classpath(请查看此this和this链接)替换以下命令行:
adb shell setprop dalvik.vm.dexopt-flags v=n,o=v
adb shell stop installd
adb shell start installd
执行测试。
我有一个类似的问题来测试相机,并且已经彻底讨论了in Espresso forum
答案 1 :(得分:1)
似乎,您必须在根视图上操作,在您的情况下是“帐户选择器”。试试这个:
public void testAccountPicker(){
onView(withText("Choose an account"))
.inRoot(withDecorView(not(is(getActivity().getWindow().getDecorView()))))
.check(matches(isDisplayed()));
}
答案 2 :(得分:0)
使用Espresso Intents https://google.github.io/android-testing-support-library/docs/espresso/intents/可以通过多种方式对此进行测试
您可以使用expected()语法验证是否已发送Intent以打开帐户选择器。您还可以使用intending()。respondWith()语法,使用选择器返回的结果验证活动的行为。
如果您确实想直接与选择器进行交互,则可以使用UIAutomator API:https://developer.android.com/topic/libraries/testing-support-library/index.html#UIAutomator
UIAutomator可以在Espresso测试中使用。