>我有一个Customview类,我想为它编写一个简单的测试。首先,我想检查是否设置了布局参数。
自定义视图类
public class CustomView extends FrameLayout {
public CustomView(@NonNull Context context) {
super(context);
initFrameLayout();
}
public void initFrameLayout() {
LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
this.setLayoutParams(layoutParams);
}
}
自定义视图测试类
public class CustomViewTest {
@Test
public void viewInitializedCorrectly() {
Context context = mock(Context.class);
CustomView customView = new CustomView(context);
int expectedViewWidth = FrameLayout.LayoutParams.MATCH_PARENT;
assertEquals(expectedViewWidth, customView.getLayoutParams().width);
}
测试失败,并显示 NullPointerException。我用调试器检查了该方法,我注意到 FrameLayout 对象存在但没有参数。我也应该嘲笑CustomView.class
吗?
Android中有许多不同类型的测试。本地单元测试在便携式计算机或台式机的 IDE 中运行,插桩单元测试在设备上运行。
本地单元测试通常无法访问像FrameLayout
这样的 Android SDK 类。相反,您将获得返回 null 的这些类的存根版本。这就解释了NullPointerException
为了解决错误,您可以手动模拟FrameLayout
或使用类似Robolectric的东西,这是一个提供测试替身的框架,称为FrameLayout
等Android类的"影子"。
但是,通常自定义视图不适合单元测试,因为它们不能轻易注入模拟(因为它们作系统从 XML 属性膨胀),并且测试通常会退化为类的反向实现。如果自定义视图确实需要超出"看起来正确"的测试,更好的选择可能是编写更适合此类事情的 Espresso 自动化 UI 测试。