Android 使用mockito测试自定义 View

标签 android unit-testing nullpointerexception mockito android-custom-view

我有一个 Customview 类,我想为其编写一个简单的测试。首先我想检查 LayoutParams 是否已设置。

自定义 View 类

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 吗?

最佳答案

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

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

为了解决该错误,您可以手动模拟 FrameLayout 或使用类似 Robolectric 的内容。这是一个框架,提供称为“影子”的 Android 类(例如 FrameLayout)的测试替身。

但是,一般来说,自定义 View 不太适合单元测试,因为它们无法轻松注入(inject)模拟(因为它们是由操作系统从 XML 属性夸大的),并且测试通常会退化为类的反向实现。如果自定义 View 确实需要超越“看起来正确”的测试,更好的选择可能是编写更适合此类事情的 Espresso 自动化 UI 测试。

关于Android 使用mockito测试自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49206106/

相关文章:

Android 预装 NDK 应用

java - Easymock 模拟输入流读取操作

c# - 在 Moq 上使用与 UserManager 的接口(interface)

java - 在menu.xml中使用actionLayout时android中的NullPointerException

android - 带有 EncryptedSharedPreferences 的 AutoBackUp 无法恢复

android - 如何使用 ViewPropertyAnimator 将 Width 设置为特定值

Android:屏幕锁定时服务停止,为什么?

unit-testing - cucumber /Rspec : Is there a way to extract tests from existing code?

java - 尝试使用 HttpURLConnection 从 url 读取信息时出现 NullPointerException

java - 调用instanceof之前是否需要进行null检查?