当前位置: 首页 > 知识库问答 >
问题:

Mockito模仿Android上下文PackageManager异常

云远
2023-03-14

我从Mockito开始进行Android无头单元测试。我想测试的部分在后端,它依赖于上下文。我尝试模仿上下文,但在运行测试时得到null。

本例中的模拟上下文并没有显示它是如何模拟的:https://developer.android.com/training/testing/unit-testing/local-unit-tests.html#setup

上面的链接(https://github.com/googlesamples/android-testing/tree/master/unit/basicsample)中提到的例子没有说明如何模拟上下文。

所以我有点迷茫。

我在gradle依赖项中有以下内容:

testCompile 'junit:junit:4.12'
androidTestCompile 'com.android.support.test:runner:0.4'
androidTestCompile 'com.android.support.test:rules:0.4'
androidTestCompile 'com.android.support:support-annotations:23.0.1'
testCompile 'org.mockito:mockito-core:1.10.19'
androidTestCompile('com.android.support.test:testing-support-lib:0.+')

代码片段:

@RunWith(MockitoJUnitRunner.class)
public static Test {
  @Mock Context mContext;
  RequestQueue mQueue;

@Test public void getCategories(){
final String SERVER = "http://{...}/categories";
mContext = mock(Context.class);
int size = 20;
when(mContext.getResources().getInteger(R.integer.cache_size)).thenReturn(size);
mQueue = VolleyUtil.newRequestQueue(mContext, null, size);

final Response.Listener<String> listener = new Response.Listener(){
//...
}

Response.ErrorListener error = new Response.ErrorListener(){
///...
}

mQueue.add(new JsonRequest(SERVER, listener, error);
}

VolleyUtil.newRequestQueue(final Context context, HttpStack stack, final int cacheMB){
final File cacheDir = new File(context.getCacheDir(), "volley");
  if(stack == null) {
     if(Build.VERSION.SDK_INT >= 9) {
        stack = new HurlStack();
     } else {
        String userAgent = "volley/0";

        try {
           final String network = context.getPackageName();
           final PackageInfo queue = context.getPackageManager().getPackageInfo(network, 0);
           userAgent = network + "/" + queue.versionCode;
        } catch (PackageManager.NameNotFoundException e) {
           e.printStacktrace();
        }

        stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
     }
  }

  final BasicNetwork network = new BasicNetwork((HttpStack)stack);
  final RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir,diskCacheMB*1000000), network);
  queue.start();
  return queue;
final PackageInfo queue = context.getPackageManager().getPackageInfo(network, 0);

共有1个答案

陆宇航
2023-03-14

因为您不是在JUnit上测试android资源,所以您也需要对此进行模拟。例如:

PackageInfo pi = new PackgeInfo();
// modify it's value the way you desire
when(mContext.getPackageManager().getPackageInfo(network, 0)).thenReturn(pi);

然后继续单元测试

 类似资料:
  • 我对Android开发是全新的,我正在尝试在Android中做一个小任务(一个注册表单)。然而,我得到以下错误: 我为Android 4.4 API level 19增加了768(以前为512),但我得到 创建上下文0x3005失败[2013-12-05 13:55:54-Emulator]模拟器:警告:无法使用软件呈现器初始化OpenglES仿真。wglGetExtensionsStringAR

  • 我不知道我的代码出了什么问题,我的静态方法都不能被 Mockito 嘲笑...... 我检查了几个小时,似乎我的代码没有任何错误。 下面是依赖性: 下面是静态方法: 下面是测试类: 运行测试后,我得到了这个异常:

  • 我需要模拟一个类,该类具有返回javax.ws.rs.core.Response的方法。该类在此方法调用之后使用 .readEntity(String.class)。我按如下方式设置响应: 现在,当使用Response.readEntity(String.class)读取此响应时;它抛出一个错误: java.lang.IllegalStateException:出站邮件不支持的方法。 如何在the

  • java.lang.NullPointerException位于java.nio.file.files.provider(files.java:97),位于java.nio.file.files.newDirectoryStream(files.java:457),位于java.nio.file.files.list(files.java:3451),位于com.classtotestStutes

  • 问题内容: 我正在尝试嘲笑课堂。当我运行以下代码时,Mockito会引发异常: 堆栈跟踪是无限重复的以下几行: 我在这里做错了什么? 问题答案: PS!您还可以模拟对getSecurityManager()方法的静态方法调用。 模拟静态方法请参见maunal,网址为http://code.google.com/p/powermock/wiki/MockitoUsage 在类级别添加@Prepare

  • 我有一个单例春豆,可以创建原型豆;这些是从字段中检索的: 现在我想为单例创建一个JUnit-Test: 但是可以理解的是,这并没有正确设置单例的< code>Provider。 有什么办法吗?我希望避免创建创建原型实例的Singleton Factory bean。 或者,对单例使用一个< code>@Lookup-factory方法是否很有可能?我还没有研究过这个。