android-如何使用Mockito模拟DisplayMetrics

我有一个自定义视图,我正在尝试针对不同的屏幕尺寸进行测试,但无法找到有关如何在单元测试中正确模拟显示宽度的文档或示例.

这是我尝试使用此方法的示例:

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?

解决方法:

要回答您的问题,您可以像在做一样嘲笑它.

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);
上一篇:java-Spring Boot单元测试-测试失败,抱怨没有定义“ entityManagerFactory” bean


下一篇:java-Mockito验证交互与验证结果