gpt4 book ai didi

android - 本地单元测试中 Build.VERSION.SDK_INT 的 stub 值

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:48:08 26 4
gpt4 key购买 nike

我想知道是否有办法 stub Build.Version.SDK_INT 的值?假设我在 ClassUnderTest 中有以下几行:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
//do work
}else{
//do another work
}

如何覆盖所有代码?

我的意思是我想使用不同的 SDK_INT 运行两个测试以进入两个 block 。

是否可以在 android local 单元测试中使用 Mockito/PowerMockito

谢谢

最佳答案

使用反射更改值。

 static void setFinalStatic(Field field, Object newValue) throws Exception {
field.setAccessible(true);

Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);

field.set(null, newValue);
}

然后

 setFinalStatic(Build.VERSION.class.getField("SDK_INT"), 123);

已经过测试。有效。

更新:有一种更简洁的方法。

创建界面

interface BuildVersionProvider {

fun currentVersion(): Int

}

实现接口(interface)

class BuildVersionProviderImpl : BuildVersionProvider {

override fun currentVersion() = Build.VERSION.SDK_INT

}

每当您需要当前构建版本时,通过接口(interface)将此类作为构造函数参数注入(inject)。然后在测试的时候创建一个SUT(System Under Test)对象。您可以自己实现接口(interface)。这种做事方式可能需要更多代码,但遵循 SOLID 原则,并为您提供可测试的代码,而不会弄乱反射和系统变量。

关于android - 本地单元测试中 Build.VERSION.SDK_INT 的 stub 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38074224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com