[英]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.MANUFACTURER
和Build. 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.