我的目标是用Mockito来模拟Build.Version.SDK_INT。已试过:
final Build.VERSION buildVersion = Mockito.mock(Build.VERSION.class);
doReturn(buildVersion.getClass()).when(buildVersion).getClass();
doReturn(16).when(buildVersion.SDK_INT);问题是:当需要方法后,模拟,而.SDK_INT不是一个方法。
发布于 2016-10-28 10:54:45
到目前为止,与其他类似于此的问题不同,它似乎需要使用反射。
How to mock a static final variable using JUnit, EasyMock or PowerMock
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);
}...and然后在这个例子中像这样使用它..。
setFinalStatic(Build.VERSION.class.getField("SDK_INT"), 16);另一种方法是创建一个类,该类可以在以后可以模拟的方法中访问/包装字段。
public interface BuildVersionAccessor {
int getSDK_INT();
}然后嘲笑那个类/接口
BuildVersionAccessor buildVersion = mock(BuildVersionAccessor.class);
when(buildVersion.getSDK_INT()).thenReturn(16);发布于 2017-08-30 12:12:05
在使用PowerMockito时,这对我很有用。
Whitebox.setInternalState(Build.VERSION.class, "SDK_INT", 16);别忘了打字
@PrepareForTest({Build.VERSION.class})发布于 2019-09-26 12:08:16
在java.lang.ExceptionInInitializerError的情况下,使用'SuppressStaticInitializationFor‘来抑制类中的任何静态块。可用的示例如下:
@SuppressStaticInitializationFor({ "android.os.Build$VERSION", "SampleClassName" )}要小心,内部类必须使用$而不是Dot。
https://stackoverflow.com/questions/40300469
复制相似问题