- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个自定义 View ,我正在尝试针对不同的屏幕尺寸进行测试,但我无法找到有关如何在单元测试中正确模拟显示宽度的文档或示例。
这是我如何尝试使用它的示例:
private CustomTextView customTV;
@Override
protected void setUp() throws Exception {
super.setUp();
DisplayMetrics displayMetrics = mock(DisplayMetrics.class);
displayMetrics.widthPixels = 600;
Resources mockResources = mock(Resources.class);
when(mockResources.getDisplayMetrics()).thenReturn(displayMetrics);
Context mockContext = mock(Context.class);
when(mockContext.getResources()).thenReturn(mockResources);
customTV = new CustomTextView(mockContext);
}
@SmallTest
public void testViewSize() {
Assert.assertEquals("Text size did not scale", 42, customTV.getTextSize());
}
此外,我只在某些设备上遇到错误(上面的实现适用于某些屏幕尺寸,但不是全部):
Error in testViewSize:
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.content.res.Configuration.isLayoutSizeAtLeast(int)' on a null object reference
at android.view.ViewConfiguration.<init>(ViewConfiguration.java:284)
at android.view.ViewConfiguration.get(ViewConfiguration.java:364)
at android.view.View.<init>(View.java:3781)
at android.view.View.<init>(View.java:3876)
at android.widget.TextView.<init>(TextView.java:655)
at android.widget.TextView.<init>(TextView.java:650)
at android.widget.TextView.<init>(TextView.java:646)
at com.foo.bar.view.CustomTextView.<init>(CustomTextView.java:55)
at com.foo.bar.view.CustomTextView.<init>(CustomTextView.java:45)
at com.foo.bar.view.CustomTextViewTests.setUp(CustomTextViewTests.java:52)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:557)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1874)
我真正想做的就是将 displayMetrics.widthPixels
的返回值设置为特定数字,但因为它不是方法调用,如 getter 或 setter,所以我无法覆盖它就像我在其他模拟对象中使用 when
和 thenReturn
方法一样。
是否有更简单的方法来模拟 Context/Resources/DisplayMetrics?
最佳答案
为了回答你的问题,你就像在做的那样 mock 它。
DisplayMetrics metrics = mock(DisplayMetrics.class);
metrics.widthPixels = 300;
Resources resources = mock(Resources.class);
when(resources.getDisplayMetrics()).thenReturn(metrics);
Assert.assertEquals(300, resources.getDisplayMetrics().widthPixels);
// ^^ see proof
您发布的错误消息只是建议您需要模拟更多对象。你做得还不够。
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.content.res.Configuration
因此还要模拟 Configuration 对象。
编辑:
如果您使用 Robolectric,则显示使用真实配置的代码:
Context context = mock(Context.class);
Resources resources = mock(Resources.class);
when(resources.getConfiguration()).thenReturn(RuntimeEnvironment.application.getResources().getConfiguration());
when(context.getResources()).thenReturn(resources);
关于android - 如何使用 Mockito 模拟 DisplayMetrics,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47841693/
我想了解 DisplayMetrics.DENSITY_DEVICE_STABLE Android 上的属性。 来自 Android 10 兼容性定义(和 Android 7 兼容性定义): [C-0
有没有人注意到这个问题并解决了在两个方向上获得一致的绝对显示尺寸的方法? 示例,Nexus 5 (5.0.1): 纵向:宽度 = 1080 高度 = 1776 横向:宽度 = 1794 高度 = 10
我正在开发一个自定义类,以帮助调整其他类的布局大小。 这是类 public class LayoutResize{ Context context; DisplayMetrics di
我正在尝试访问一些 DisplayMetrics 数据,但一切都返回零。这就是我初始化显示指标对象的方式: DisplayMetrics display = new DisplayMetrics();
我想获取设备屏幕的 dpi,但是当我使用时: DisplayMetrics m = getResources().getDisplayMetrics();
我有两种不同的平板电脑: 10.1 英寸平板电脑 - 1280x800 @ ~149dpi 15.6 英寸平板电脑 - 1920x1080 @ ~156dpi 就实际物理(现实世界)规范而言,这些平板
我有一个 Samsung Galaxy S4 Active 当我在Android上执行时,如下代码: DisplayMetrics dm = new DisplayMetrics(); getWind
在 Debug模式下, metrics.xdpi 和 .ydpi 都返回 160。但是,我有一部 5"1920x1080 手机。我做错了什么? DisplayMetrics metrics =
我正在开发一个 Android 游戏(在 libgdx 中),但有一个问题:我需要获取设备的 dpi 以获得更好的游戏体验。所以我尝试使用 DisplayMetrics。 DisplayMetrics
小问题 DisplayMetrics.densityDpi 在 root 设备上似乎为零。 长题 我在我的应用中使用了以下代码: public static int getIconSize(Activ
我使用 displaymetrics 来获取设备的屏幕尺寸。在智能手机中效果很好,但在平板电脑中它返回屏幕宽度和高度的 2/3。谁能告诉我这是为什么? 这是代码: DisplayMetrics met
第一种方法: DisplayMetrics displayMetrics = this.getResources().getDisplayMetrics(); int deviceHeight = d
我有一个自定义 View ,我正在尝试针对不同的屏幕尺寸进行测试,但我无法找到有关如何在单元测试中正确模拟显示宽度的文档或示例。 这是我如何尝试使用它的示例: private CustomTextVi
我刚开始使用 Android 编程,但在以下代码中收到错误: DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefau
我想了解 Android 中的 sp 单元,但我无法真正弄清楚它是如何工作的。 documentation说: sp Scale-independent Pixels - This is like t
获取 DisplayMetrics 的正确方法是什么,即获取屏幕/显示信息,例如 density 或 xdpi? 我问是因为我看到了两种解决方法: 第一: DisplayMetrics met
我试过这个...... DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().ge
我正在设计我的第一个 Android 应用程序,其中一部分需要获取屏幕尺寸。我以标准方式使用 DisplayMetrics 对象: DisplayMetrics metrics = new Displ
编辑 2 编辑 覆盖 attachBaseContext 方法以更新 Activity 中的上下文 protected override void AttachBaseContext(Context
我需要在 Android AppWidget 中确定运行时的屏幕密度。我已经设置了一个 HDPI 模拟器设备 (avd)。如果设置一个常规的可执行项目,并将此代码插入到 onCreate 方法中: D
我是一名优秀的程序员,十分优秀!