对网络响应进行单元测试。在调试时有效,而不是在实际运行时有效

2023-11-25

我目前正在尝试测试是否确实收到了网络响应。

虽然我知道这不是我应该做的测试,但这是我自己的好奇心,如果可能的话我想继续下去。

就目前情况而言,我已经成功创建了测试。请求会毫无问题地发送到齐射队列。

现在奇怪的部分:

该请求永远不会被执行。这是我如何测试它的想法:

 @Test
    public void testSimpleGetResponseFromServerVolley() throws Exception {
        final CountDownLatch signal = new CountDownLatch(1);

        NetworkClass.NetworkListener listener = new NetworkClass.NetworkListener() {
            @Override
            public void onResponse(Response response) {
                assertThat(response != null);
                System.out.println("Got Response");
                signal.countDown();

            }

            @Override
            public void onError(Throwable error) {
                System.out.println("No Response");
                signal.countDown();
            }
        };
        NetworkClass.getResponseFromServer(null, listener);
        signal.await();
    }

此代码意外地导致测试挂起并且永远无法完成。

然而,这是我不再失去对情况的理解的地方:

如果我通过运行测试debug并逐行执行,测试成功执行,并收到响应。

我认为正在发生的事情:

当我通过调试单步执行时,齐射请求队列成功地进行并发出请求,并且之前收到了响应await()叫做。

当我不通过调试单步执行时,await()正在阻塞处理所有这些的线程。

关于我如何处理这个问题有什么想法吗?


凌空依靠Looper.getMainLooper()处理其处决。当使用 RobolectricTestRunner 时,Robolectric 会对此进行模拟,因此不会正确设置,从而导致测试失败。

在我的具体情况下,当我使用断点时,系统实际上does设置主循环器,因为系统正在利用它来显示断点/调试工具。因此,这描述了我最初的问题中发现的行为背后的原因。

现在,为了在单元测试期间使用 Volley 获得真实的网络响应,必须将执行器更改为不使用主循环程序。

作为一个简单的解决方案,创建一个依赖于的请求队列Executor.singleThreadExecutor()而不是主循环器。

我的意思是:

    //Specific test queue that uses a singleThreadExecutor instead of the mainLooper for testing purposes.
public RequestQueue newVolleyRequestQueueForTest(final Context context) {
    File cacheDir = new File(context.getCacheDir(), "cache/volley");
    Network network = new BasicNetwork(new HurlStack());
    ResponseDelivery responseDelivery = new ExecutorDelivery(Executors.newSingleThreadExecutor());
    RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network, 4, responseDelivery);
    queue.start();
    return queue;
}

然后,在测试期间将其用作 Volley 的请求队列。

这里的关键是:

ResponseDelivery responseDelivery = new ExecutorDelivery(Executors.newSingleThreadExecutor());

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对网络响应进行单元测试。在调试时有效,而不是在实际运行时有效 的相关文章

随机推荐

  • std::sort 如何处理对列表?

    为什么this include
  • 如何为约束布局上的嵌套视图设置动画?

    我有一个要求 视图需要位于底部中心并根据其内容调整高度 于是创建了constraint layout根内constraint layout为了达成这个 但现在我面临动画的问题 我无法申请constraintSet
  • 搜索函数源代码

    在 R 中 您可以将函数的源视为函数只是另一个对象 我正在寻找一种方法来搜索此源代码 而不知道源代码保存在哪个文件中 例如 我可能想知道该函数是否shapiro test包含函数sort 确实如此 If shapiro test是我要使用的
  • 在 iPhone 应用程序中将单个像素直接绘制到屏幕上的最快方法是什么?

    我正在寻找在 iPhone 应用程序中将数千个单独计算的像素直接绘制到屏幕上的最快方法 该应用程序的性能非常好 最有可能使用 OpenGL 例如 glBegin GL POINTS glColor3f glVertex3f glEnd 甚至
  • Mac 上的 cronjobs 入门

    我正在尝试熟悉 cron 作业 我想我已经了解了基本的想法 调度 语法等 但是 我似乎无法在我的 mac 上使用终端来正确地完成它 我到底在哪里可以找到定时任务 我应该如何引用脚本的路径 我想做的是在远程机器上点击 php 脚本 http
  • CSS 中不断扩展的中间体

    我将如何设计一个具有固定高度的页眉和页脚 附加到浏览器窗口的顶部和底部 但中间可扩展的网站 滚动条仅适用于中间 图中的橙色部分 因此页面的其余部分永远不需要滚动 为了更清楚地解释 我在下面画了一个模型 理想情况下 它需要完全用 CSS 和
  • 如何在 SSRS 报告中创建动态列

    I need to create a SSRS report like 我有 3 列的表格开发者名称 工作时间 日期 如何创建报告以及获取数据的 sql 查询是什么 我不要求完整的 SQL 查询 我只需要一些提示 您可以使用 Matrix
  • Python 重新“伪造转义错误”

    我一直在摆弄 python re 模块 search方法 cur是来自 Tkinter 条目小部件的输入 每当我在条目小部件中输入 时 它都会引发此错误 我不太确定错误是什么或如何处理它 任何见解将不胜感激 cur是一个字符串 tup 0
  • SevenZipSharp - 压缩内存流

    我正在使用 SevenZipSharp 将文件压缩为 zip 文件 有没有办法使用它从内存流创建 zip 也就是说 之前将文件加载到内存流中 谢谢 玛雅 我正在使用 SevenZipSharp 来处理流 没有任何问题 SevenZip Se
  • 这个标志到底意味着什么? |=

    我很想了解这个运营商 我在 Java 中设置标志时见过这种表示法 例如 notification flags Notification FLAG AUTO CANCEL 它是否执行某种位操作 这个标记到底有什么作用 还有其他类似的众所周知的
  • 如何在android中打开特定的短信

    有没有办法用特定的短信在android上打开消息传递活动 threadId应该是您要查看的 SMS MMS 线程的 id Intent defineIntent new Intent Intent ACTION VIEW defineInt
  • 是否可以输入多种类型的提示?

    我可以使用类型提示允许两种不同的类型吗 例如 范围 requester可以是以下任一者User or File function log User File requester 从 PHP 8 0 开始 这将是可能的包含联合类型 The 该
  • Subversion:合并时“目标路径不存在”是什么意思?

    使用 subversion 1 5 我有分支 B 它是从分支 A 分支出来的 在两个分支中完成工作后 我将更改从 A 合并到 B 中 使用svn merge http path to A在B 的工作目录中并得到svn Target path
  • 为什么在结构体的构造函数中设置属性不起作用?

    我有以下不允许的代码 下面的错误 为什么 struct A private int b public A int x B x public int B get return b set b value 我收到以下错误 在分配 this 对象
  • 如何让 Matlab 读取正确数量的 xml 节点

    我正在使用 matlab 的 xmlread 内部函数读取一个简单的 xml 文件
  • MapView.onMapReady 从未在 Fragment 中调用以在 MapView 中加载 Google 地图

    我将尝试在 Android 应用程序中的名为的片段上显示地图RoeteFragment 如果我调试我的代码 我会看到该方法onMapReady永远不会被调用 因此地图不会加载 该片段实现了OnMapReadyCallback喜欢需要并且在o
  • JavaScript ecma6 将普通函数更改为箭头函数

    我有那个代码 function defineProperty object name callback if object prototype Object defineProperty object prototype name get
  • 在 UITableView 底部添加活动指示器? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 I have UITableview像第一个这样的分页将从服务器获取 20 个对象并填充UITableView然后 当它到达最后一行时 需要进行另一个服务调用来获取接下来的 20 个对象
  • 在 TestNG/Selenium 中自动重启失败的测试用例

    我正在使用 Selenium webdriver 在 Java 中与 TestNG 一起运行 X 数量的测试用例 我希望任何测试用例一旦失败就自动重新启动 无论是从开始还是从故障点 我知道TestNG框架有以下方法 Override pub
  • 对网络响应进行单元测试。在调试时有效,而不是在实际运行时有效

    我目前正在尝试测试是否确实收到了网络响应 虽然我知道这不是我应该做的测试 但这是我自己的好奇心 如果可能的话我想继续下去 就目前情况而言 我已经成功创建了测试 请求会毫无问题地发送到齐射队列 现在奇怪的部分 该请求永远不会被执行 这是我如何