【发布时间】: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);
}
}
}
如您所见,我在ActivityController 和driving the Activity lifecycle 上以正确的方式调用visible() 方法。引用文档:
等等,这是什么可见的()废话?
事实证明,在真正的 Android 应用中,视图层次结构
Activity直到onCreate()之后的某个时间才附加到Window叫做。在这种情况发生之前,Activity 的视图不会报告为 可见的。这意味着您不能点击它们(以及其他意想不到的 行为)。 Activity 的层次结构附加到 Window 上 Activity 上onPostResume()之后的设备或模拟器。而不是 对何时应该更新可见性做出假设, Robolectric 在编写时将权力交到开发人员手中 测试。那么你什么时候调用它?每当您与视图交互时 活动内部。像
Robolectric.clickOn()这样的方法需要 视图是可见的并正确连接以发挥作用。你 应该在create()之后调用visible()。
似乎我正在做我需要做的一切。那么为什么我没有得到高度/宽度呢?
【问题讨论】:
-
可能不相关,但您缺少
start()。
标签: android-layout robolectric activity-lifecycle