Robolectric 3.x编写屏幕分辨率/多语言/资源文件相关测试用例

在编写 Android 测试用例的时候,有时候我们需要涉及到屏幕分辨率相关测试用例。

比如不同分辨率得到不同的像素数值,可以参考如下:

@RunWith(RobolectricTestRunner.class)
@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*"})
@Config(sdk = Build.VERSION_CODES.P)
public class DimensUnitTest {

    @Test
    @Config(qualifiers = "w480dp-h800dp")
    public void dimens800x480_isCorrect() {
        final Context context = RuntimeEnvironment.application;
        final double ref100DpBase = 42.666667;

        float expectDp = 110;
        double dips = context.getResources().getDimension(R.dimen.dimen_110);

        assertEquals(ref100DpBase * expectDp / 100, dips, delta);

        for (Map.Entry<Integer, Double> entry : expectDimens.entrySet()) {
            dips = context.getResources().getDimension(entry.getKey());
            assertEquals(ref100DpBase * entry.getValue() / 100, dips, delta);
        }
    }
	
}

比如不同语言得到不同的字符串,可以参考如下:

@RunWith(RobolectricTestRunner.class)
@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*"})
@Config(sdk = Build.VERSION_CODES.P)
public class LangUnitTest {

    /**
     * 使用qualifiers加载对应的资源文件
     *
     * @throws Exception
     */
    @Config(qualifiers = "zh-rCN")
    @Test
    public void testString() throws Exception {
        final Context context = RuntimeEnvironment.application;
        assertThat(context.getString(R.string.app_name), is("单元测试Demo"));
    }
	
}

其他相关的测试参数,参考 Device Configuration

注意需要在 build.gradle 中增加资源包含信息,否则在测试的时候会找不到指定的资源文件,默认只测试代码,被测试的资源文件不打包进入应用。

参考如下:

    testOptions {
        unitTests {
            includeAndroidResources = true
            all {
                //命令行下 单元测试可能卡住的问题
                jvmArgs '-noverify'
                //robolectric外部指定下载资源链接的参数,使用 -D 参数指定 bash gradlew clean build -Drobolectric.dependency.repo.url=http://127.0.0.1/jcenter
                systemProperty 'robolectric.dependency.repo.url', System.getProperty("robolectric.dependency.repo.url")
                systemProperty 'robolectric.dependency.repo.id', System.getProperty("robolectric.dependency.repo.id")
            }
        }
    }

参考链接