Android espresso和帐户选择器

时间:2014-02-11 13:31:45

标签: android android-espresso accountpicker

我无法使用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提前给出答案。

3 个答案:

答案 0 :(得分:3)

这是一个艰难的:)。这里的问题是,一旦流程离开您的应用程序(Google帐户选择器是外部应用程序),Espresso就会结束测试。帐户选择器是包com.google.android.gms中的活动,因此是外部活动。一旦启动,您的测试就完成了,您将永远无法匹配对话框中的任何内容。

您有三种可能的解决方案可以让您的测试变得可行:

  • 在您的应用上使用类路径替换来伪造意图;或
  • 修复您的应用“可测试性”;或
  • 使用依赖注入,例如Dagger

我将展示如何使用类路径替换。这个技术非常简单:你应该在一个单独的类中隔离你的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(请查看此thisthis链接)替换以下命令行:

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测试中使用。