【问题标题】:Android Unit Testing - method to test returning nullAndroid 单元测试 - 测试返回 null 的方法
【发布时间】:2017-10-19 05:35:12
【问题描述】:

测试方法:

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

【问题讨论】:

  • Build.MANUFACTURER 和 Build.MODEL 的值是多少?
  • 类似这样的东西:Genymotion 三星 Galaxy S8 - 7.0.0 - API 24 - 1440x2960
  • 您需要调试您的测试用例,您的实用程序类中似乎缺少一些东西。您也可以发送您的实用程序类吗?
  • 在测试类上:Build.MANUFACTURER 和 Build.MODEL 返回 null
  • 能否给我们看一下课堂的相关部分Build

标签: java android unit-testing junit mockito


【解决方案1】:

您不能测试getDeviceName()Build.MANUFACTURERBuild. MODEL 将返回 null。厂商和型号也是来自设备,你的IDE是怎么弄到的?

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

【讨论】:

【解决方案2】:

您可以使用以下代码在您的测试中设置 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)
    }
}

【讨论】:

    猜你喜欢
    • 2020-06-14
    • 2014-11-08
    • 2022-07-27
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多