如何使用Roboelectric测试从ViewTreeObserver在onGlobalLayout内执行的代码?

时间:2015-07-14 21:34:35

标签: android robolectric android-testing

我的片段中有以下代码:

public void someMethod()
{
    scrollView.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener()
                {
                    @Override
                    public void onGlobalLayout()
                    {    

                    // code that I want to test

                    }
                 }
}

但是,当我尝试测试此方法时,我无法在GlobalLayoutListener中运行代码。我尝试以不同的方式强制执行监听器,但是当我检查调试时,scrollerView没有任何GlobalLayoutListeners。

我要测试的代码是在Fragment中,这是我在测试中已经尝试过的:

SupportFragmentTestUtil.startVisibleFragment( fragment );
fragment.scrollView.getViewTreeObserver().dispatchOnGlobalLayout();

我也尝试过:

shadowOf(fragment.scrollView.getViewTreeObserver()).fireOnGlobalLayoutListeners();

然而,侦听器内的代码永远不会被执行。

1 个答案:

答案 0 :(得分:2)

我通过使用以下参数手动调用Fragment的 createView 方法来解决此问题:

    FrameLayout container = new FrameLayout( RuntimeEnvironment.application );
            fragment.createView( LayoutInflater.from( RuntimeEnvironment.application ), container );
FrameLayout container = new FrameLayout( RuntimeEnvironment.application );
fragment.createView( LayoutInflater.from( RuntimeEnvironment.application ), container );

最终添加了globalLayoutListener,当我执行以下代码时, onGlobalLayout()方法正确执行:

shadowOf( fragment.scrollView.getViewTreeObserver() ).fireOnGlobalLayoutListeners();