使用Mockito模拟构建版本 [英] Mock Build Version with Mockito

查看:133
本文介绍了使用Mockito模拟构建版本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的目标是使用Mockito模拟Build.Version.SDK_INT.已经尝试过:

My target is to mock Build.Version.SDK_INT with Mockito. Already tried:

final Build.VERSION buildVersion = Mockito.mock(Build.VERSION.class);
doReturn(buildVersion.getClass()).when(buildVersion).getClass();
doReturn(16).when(buildVersion.SDK_INT);

问题在于:在模拟之后需要方法时,而.SDK_INT不是方法.

Problem is that: when requires method after mock, and .SDK_INT is not a method.

推荐答案

到目前为止,与该问题类似的其他问题似乎都需要使用反射.

So far from other questions similar to this one it looks like you have to use reflection.

在本地单元测试中Build.VERSION.SDK_INT的存根值

如何使用JUnit,EasyMock或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 then in this case use it like this...

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

另一种解决方法是创建一个类,该类使用一种以后可以模拟的方法来访问/包装字段

Another way around would be to create a class that accesses/wraps the field in a method that can be later mocked

public interface BuildVersionAccessor {
    int getSDK_INT();
}

然后模拟该类/接口

BuildVersionAccessor buildVersion = mock(BuildVersionAccessor.class);
when(buildVersion.getSDK_INT()).thenReturn(16);

这篇关于使用Mockito模拟构建版本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆