【问题标题】:Why are the height and width of the content View zero in Robolectric?为什么 Robolectric 中内容视图的高度和宽度为零?
【发布时间】:2013-11-07 06:35:26
【问题描述】:

这是一个失败的测试:

@RunWith(RobolectricTestRunner.class)
public class FailTest {

    @Test
    public void heightAndWidth_shouldNotBeZero() {
        TestActivity testActivity = Robolectric.buildActivity(TestActivity.class).create().resume().visible().get();
        View contentView = testActivity.findViewById(69);
        Assertions.assertThat(contentView.getWidth()).isNotZero();
        Assertions.assertThat(contentView.getHeight()).isNotZero();
    }

    private static class TestActivity extends Activity {
        @Override protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            LinearLayout contentView = new LinearLayout(this);
            contentView.setId(69);
            contentView.setLayoutParams(new LayoutParams(666, 666));
            setContentView(contentView);
        }
    }
}

如您所见,我在ActivityControllerdriving the Activity lifecycle 上以正确的方式调用visible() 方法。引用文档:

等等,这是什么可见的()废话?

事实证明,在真正的 Android 应用中,视图层次结构 Activity 直到 onCreate() 之后的某个时间才附加到 Window 叫做。在这种情况发生之前,Activity 的视图不会报告为 可见的。这意味着您不能点击它们(以及其他意想不到的 行为)。 Activity 的层次结构附加到 Window 上 Activity 上onPostResume() 之后的设备或模拟器。而不是 对何时应该更新可见性做出假设, Robolectric 在编写时将权力交到开发人员手中 测试。

那么你什么时候调用它?每当您与视图交互时 活动内部。像Robolectric.clickOn() 这样的方法需要 视图是可见的并正确连接以发挥作用。你 应该在create() 之后调用visible()

似乎我正在做我需要做的一切。那么为什么我没有得到高度/宽度呢?

【问题讨论】:

  • 可能不相关,但您缺少start()

标签: android-layout robolectric activity-lifecycle


【解决方案1】:

Robolectric 中没有布局通道,因此视图尺寸始终为零。

https://github.com/robolectric/robolectric/issues/819

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-15
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 2016-03-16
    相关资源
    最近更新 更多