繁体   English   中英

Android 单元测试 - 测试返回空值的方法

[英]Android Unit Testing - method to test returning null

测试方法:

public static String getDeviceName() {
    String manufacturer = Build.MANUFACTURER;
    String model = Build.MODEL;
    if (model.startsWith(manufacturer)) {
        return WordUtils.capitalize(model);
    } else {
        return WordUtils.capitalize(manufacturer) + " " + model;
    }
}

测试用例:

@Test
public void testGetDeviceName() throws Exception {
    String deviceNameTest = "device name";
    assertEquals(deviceNameTest, DeviceUtil.getDeviceName());
}

错误

java.lang.NullPointerException

getDeviceName(DeviceUtil.java:15) DeviceUtilTest.testGetDeviceName(DeviceUtilTest.java:18)

DeviceUtil.getDeviceName() -> 返回 null

您不能测试getDeviceName()Build.MANUFACTURERBuild. MODEL Build. MODEL将返回空值。 制造商和型号也来自设备,您的IDE如何获得它?

顺便说一句,如果你想用静态方法测试 Util 类,我建议你也使用PowerMock或者你必须创建 util 的包装类进行测试。

您可以使用以下代码在测试中设置 android.os.Build.MANUFACTURER 和 android.os.Build.MODEL 的值:

ReflectionHelpers.setStaticField(android.os.Build::class.java, "MANUFACTURER", "My Manufacturer")
ReflectionHelpers.setStaticField(android.os.Build::class.java, "MODEL", "My Model ")

在下面找到完整的代码。

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
internal class DeviceInfoManagerImplTest{
    private lateinit var manager: DeviceInfoManagerImpl
    private lateinit var context: Context
    private lateinit var firebaseTokenManager: FirebaseManager
    private lateinit var dispatchers: CoroutineDispatchers

    @BeforeAll
    fun setUp(){
        context = mockk(relaxed = true)
        firebaseTokenManager= mockk()
        dispatchers = spyk()
        manager = DeviceInfoManagerImpl(context,
                firebaseTokenManager,
                dispatchers)

        coEvery { dispatchers.io } returns
                CoroutineDispatchersImpl().io

        coEvery { firebaseTokenManager.getToken() } returns "token"
        ReflectionHelpers.setStaticField(android.os.Build::class.java, "MANUFACTURER", "My Manufacturer")
        ReflectionHelpers.setStaticField(android.os.Build::class.java, "MODEL", "My Model ")

        mockkStatic(Settings.Secure::class)

        every {
            Settings.Secure.getString(context.contentResolver,
                    Settings.Secure.ANDROID_ID)
        } answers {
            "My ID"
        }
    }

    @Test
    fun test(){
        val deviceInfo = runBlocking { manager.getDeviceInfo() }
        println(deviceInfo.deviceManufacturer)
        println(deviceInfo.deviceUniqueIdentification)
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM