Android 使用 mockito 测试自定义视图



>我有一个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 测试。

相关内容

  • 没有找到相关文章

最新更新