测试网络响应的单元.在调试时工作,而不是在实际运行时工作



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

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

目前,我已经成功创建了测试。一个请求被发送到一个截击队列而没有问题。

现在奇怪的部分:

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

 @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();
    }

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

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

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

我认为正在发生的事情:

当我通过调试完成时,截击requestQueue成功地进行并发出请求,并且在调用await()之前收到响应。

当我没有通过调试来完成时,await()会阻塞处理所有这些的线程。

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

Volley依靠Looper.getMainLooper()来处理其执行。当使用RobolectricTestRunner时,Robolectic会对此进行模拟,因此它将无法正确设置,从而导致测试失败。

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

现在,对于在单元测试期间使用Volley获得真实网络响应的解决方案,必须将执行器更改为不使用主活套。

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

我的意思是:

    //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=新的ExecutorDelivery(Executitors.newSingleThreadExecutor())

希望这能有所帮助!

相关内容

  • 没有找到相关文章

最新更新