【发布时间】:2016-08-30 04:14:14
【问题描述】:
我目前正在尝试测试是否确实收到了网络响应。
虽然我知道这不是我在测试方面应该做的事情,但这是我自己的好奇心,如果可能的话,我想继续。
就目前而言,我已经成功创建了测试。请求被毫无问题地发送到排球队列。
现在奇怪的部分:
该请求永远不会执行。这是我如何测试它的想法:
@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 运行测试并逐行执行,测试成功执行,并收到响应。
我认为正在发生的事情:
当我通过调试单步执行时,volley requestQueue 成功进行并发出请求,并在调用await() 之前收到响应。
当我不通过调试单步执行时,await() 正在阻塞处理所有这些的线程。
关于如何处理这个问题的任何想法?
【问题讨论】:
-
@Test?那是什么?
-
这是一个 jUnit 测试,正如我的标签所暗示的那样。
-
如果断言失败,countDown() 永远不会被调用。我不知道 junit 在多线程测试中的行为如何,但我在其他测试框架的情况下看到了奇怪的行为。
-
不,断言没有失败,测试只是无限期挂起。
-
尝试使用带有超时的signal.await(),然后查看是否发生超时。这样你就可以确定是否是测试挂起的原因。
标签: android junit mockito android-testing android-networking