这是一个失败的测试:
@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);
}
}
}
如您所见,我正在调用Activityvisible()
上的方法ActivityController
并以正确的方式驱动 Activity 生命周期。引用文档:
等等,这是什么可见的()废话?
事实证明,在一个真正的 Android 应用程序中, 直到某个时间之后才 调用an
Activity
的视图层次结构。在这种情况发生之前,Activity 的视图不会报告为可见。这意味着您无法单击它们(以及其他意外行为)。Activity 的层次结构在 Activity 之后附加到设备或模拟器上的 Window 。Robolectric 并没有对何时应该更新可见性做出假设,而是在编写测试时将权力交到开发人员手中。Window
onCreate()
onPostResume()
那么什么时候调用呢?每当您与 Activity 中的视图交互时。像这样的方法
Robolectric.clickOn()
要求视图是可见的并正确附加才能正常工作。你应该visible()
在之后打电话create()
。
好像我正在做我需要做的一切。那么为什么我没有得到高度/宽度呢?