我有一个 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/