使用 Mockito 模拟构建版本
Mock Build Version with Mockito
我的目标是使用 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);
问题是:当 mock 之后需要方法时,.SDK_INT 不是方法。
到目前为止,与其他类似的问题相比,您似乎必须使用反射。
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);
}
...然后在这种情况下像这样使用它...
setFinalStatic(Build.VERSION.class.getField("SDK_INT"), 16);
另一种方法是创建一个 class 方法中的 accesses/wraps 字段,以后可以对其进行模拟
public interface BuildVersionAccessor {
int getSDK_INT();
}
然后嘲笑 class/interface
BuildVersionAccessor buildVersion = mock(BuildVersionAccessor.class);
when(buildVersion.getSDK_INT()).thenReturn(16);
这对我在使用 PowerMockito 时有效。
Whitebox.setInternalState(Build.VERSION.class, "SDK_INT", 16);
别忘了输入
@PrepareForTest({Build.VERSION.class})
在 java.lang.ExceptionInInitializerError 的情况下,使用 'SuppressStaticInitializationFor' 抑制 class 中的任何静态块。可用示例如下:
@SuppressStaticInitializationFor({ "android.os.Build$VERSION", "SampleClassName" )}
注意内部 class 必须使用 $ 而不是点 .
我的目标是使用 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);
问题是:当 mock 之后需要方法时,.SDK_INT 不是方法。
到目前为止,与其他类似的问题相比,您似乎必须使用反射。
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);
}
...然后在这种情况下像这样使用它...
setFinalStatic(Build.VERSION.class.getField("SDK_INT"), 16);
另一种方法是创建一个 class 方法中的 accesses/wraps 字段,以后可以对其进行模拟
public interface BuildVersionAccessor {
int getSDK_INT();
}
然后嘲笑 class/interface
BuildVersionAccessor buildVersion = mock(BuildVersionAccessor.class);
when(buildVersion.getSDK_INT()).thenReturn(16);
这对我在使用 PowerMockito 时有效。
Whitebox.setInternalState(Build.VERSION.class, "SDK_INT", 16);
别忘了输入
@PrepareForTest({Build.VERSION.class})
在 java.lang.ExceptionInInitializerError 的情况下,使用 'SuppressStaticInitializationFor' 抑制 class 中的任何静态块。可用示例如下:
@SuppressStaticInitializationFor({ "android.os.Build$VERSION", "SampleClassName" )}
注意内部 class 必须使用 $ 而不是点 .