代码之家  ›  专栏  ›  技术社区  ›  grrrrrr

为什么android api 22上的espresso测试中idlingresource为空?

  •  1
  • grrrrrr  · 技术社区  · 6 年前

    编辑: 我已经在Android API 22上的两个设备和API 19上的一个设备上测试了下面的内容,API 19上的一个设备没有问题。你知道版本之间有什么区别吗?

    我正在为我的Android设置一个与示例相同的idlingresource的espresso测试

    我的测试设置:

    规则 公共活动测试规则<mainActivity>mmainActivity= 新建ActivityTestRule(mainActivity.class); 私有idlingresource Midlingresource; @之前 public void registerIdingResource()。{ MidlingeSource=mmainactivity.getActivity().getIDlingeSource(); idlingregistry.getInstance().register(Midlingresource); }
    
    

    在我的活动中,每次更改空闲状态时,我都会调用:

    if(中间资源!=空){
    MidlingeSource.setIdleState(false);
    }其他{
    log.d(“错误”,“空闲资源为空”);
    }
    
    
    

    当尝试更改活动中的空闲状态时,我的问题出现了——似乎在创建活动和idlingresource可用之间存在延迟。

    在序列的第一个测试中,idlingresource永远不可用——因此,我无法将idlingresource的初始值设置为false,然后切换回true。这似乎是由注释生命周期引起的,如本文

    据我所知,活动是由@rule创建的,然后idlingresource在@before中实例化。由于活动已经在运行,因此在我尝试更改状态的每个点上,空闲资源都为空。

    在随后的测试中,只跳过setIdleState的第一个实例(发生在onCreate中),可能与@rule的活动生命周期有关?--但其他人按预期运作。

    在第一次测试之前,是否有一个让@rule和@before按顺序工作的最佳实践?

    我正在为我的android设置一个与示例相同的idlingresource的浓缩咖啡测试here.

    我的测试设置:

    @Rule
    public ActivityTestRule<MainActivity> mMainActivity =
            new ActivityTestRule(MainActivity.class);
    
    private IdlingResource mIdlingResource;
    
    @Before
    public void registerIdlingResource() {
        mIdlingResource = mMainActivity.getActivity().getIdlingResource();
        IdlingRegistry.getInstance().register(mIdlingResource);
    }
    

    在我的活动中,每次更改空闲状态时,我都会调用:

    if (mIdlingResource != null) {
        mIdlingResource.setIdleState(false);
    } else {
        Log.d("error ", "idle resource is null");
    }
    

    当尝试更改活动中的空闲状态时,我的问题出现了——在创建活动和idlingresource可用之间似乎存在延迟。

    在序列的第一个测试中,idlingresource永远不可用--因此,我不能将idlingresource的初始值设置为false,然后切换回true。这似乎是由注释生命周期引起的,如中所述this article:

    enter image description here

    据我所知,活动是由@rule创建的,然后idlingresource在@before中实例化。因为活动已经在运行,所以在我尝试更改状态的每个点上,空闲资源都是空的。

    在随后的测试中,只跳过setIdleState的第一个实例(发生在onCreate中),可能与@rule的活动生命周期有关?--但其他人的行动与预期一致。

    在第一次测试之前,是否有一个让@rule和@before按顺序工作的最佳实践?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Sanchita Santra    6 年前

    static IdlingResource mIdlingResource

    private static IdlingResource mIdlingResource;
    
    //Getter for mIdlingResource
    public IdlingResource getmIdlingResource() {
        return mIdlingResource;
    }
    

    @Before
    public void registerIdlingResource() {
        IdlingRegistry.getInstance().register(mMainActivity.getActivity().getmIdlingResource());
    }
    

    https://developer.android.com/reference/android/support/test/espresso/idling/CountingIdlingResource

    getIdlingResource() onCreate() setIdleState null

        2
  •  1
  •   grrrrrr    6 年前

    ActivityTestRule(Class<T> activityClass, boolean initialTouchMode, boolean launchActivity)

    @Rule
    public ActivityTestRule<MainActivity> mMainActivity =
            new ActivityTestRule(MainActivity.class, false, true);
    
    private IdlingResource mIdlingResource;
    
    @Before
    public void registerIdlingResource() {
        mIdlingResource = mMainActivity.getActivity().getIdlingResource();
        IdlingRegistry.getInstance().register(mIdlingResource);
        mMainActivity.launchActivity(new Intent());
    }