【问题标题】:Android Testing custom views with mockitoAndroid 使用 mockito 测试自定义视图
【发布时间】:2018-03-10 06:32:35
【问题描述】:

我有一个 Customview 类,我想为它写一个简单的测试。一开始我想检查是否设置了 LayoutParams。

自定义视图类

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);
}

}

CustomViewTest 类

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 unit-testing nullpointerexception mockito android-custom-view


    【解决方案1】:

    tests in Android 有多种不同类型。 本地单元测试在笔记本电脑或台式机上的 IDE 中运行,仪表化单元测试在设备上运行。

    本地单元测试通常无法访问像 FrameLayout 这样的 Android SDK 类。相反,您会得到这些返回 null 的类的版本。这解释了NullPointerException

    为了绕过该错误,您可以手动模拟FrameLayout 或使用Robolectric 之类的框架,该框架提供称为FrameLayout 等Android 类的“影子”的测试替身。

    但是,通常自定义视图不太适合单元测试,因为它们不能轻松地注入模拟(因为它们被操作系统从 XML 属性膨胀)并且测试通常会退化为类的反向实现。如果自定义视图确实需要在“看起来不错”之外进行测试,那么更好的选择可能是编写更适合这类事情的 Espresso 自动化 UI 测试。

    【讨论】:

      猜你喜欢
      • 2011-06-22
      • 1970-01-01
      • 2013-08-15
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      相关资源
      最近更新 更多