首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Mockito的模拟构建版本

使用Mockito的模拟构建版本
EN

Stack Overflow用户
提问于 2016-10-28 07:51:48
回答 3查看 9.5K关注 0票数 11

我的目标是用Mockito来模拟Build.Version.SDK_INT。已试过:

代码语言:javascript
复制
final Build.VERSION buildVersion = Mockito.mock(Build.VERSION.class);
doReturn(buildVersion.getClass()).when(buildVersion).getClass();
doReturn(16).when(buildVersion.SDK_INT);

问题是:当需要方法后,模拟,而.SDK_INT不是一个方法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-28 10:54:45

到目前为止,与其他类似于此的问题不同,它似乎需要使用反射。

INT in Local Unit Test

How to mock a static final variable using JUnit, EasyMock or PowerMock

代码语言:javascript
复制
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然后在这个例子中像这样使用它..。

代码语言:javascript
复制
setFinalStatic(Build.VERSION.class.getField("SDK_INT"), 16);

另一种方法是创建一个类,该类可以在以后可以模拟的方法中访问/包装字段。

代码语言:javascript
复制
public interface BuildVersionAccessor {
    int getSDK_INT();
}

然后嘲笑那个类/接口

代码语言:javascript
复制
BuildVersionAccessor buildVersion = mock(BuildVersionAccessor.class);
when(buildVersion.getSDK_INT()).thenReturn(16);
票数 19
EN

Stack Overflow用户

发布于 2017-08-30 12:12:05

在使用PowerMockito时,这对我很有用。

代码语言:javascript
复制
Whitebox.setInternalState(Build.VERSION.class, "SDK_INT", 16);

别忘了打字

代码语言:javascript
复制
@PrepareForTest({Build.VERSION.class})
票数 7
EN

Stack Overflow用户

发布于 2019-09-26 12:08:16

在java.lang.ExceptionInInitializerError的情况下,使用'SuppressStaticInitializationFor‘来抑制类中的任何静态块。可用的示例如下:

代码语言:javascript
复制
@SuppressStaticInitializationFor({ "android.os.Build$VERSION", "SampleClassName" )}

要小心,内部类必须使用$而不是Dot。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40300469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档