首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >锁定异步方法直到回调

锁定异步方法直到回调
EN

Stack Overflow用户
提问于 2014-07-11 09:59:33
回答 2查看 865关注 0票数 0

我有个方法要测试

代码语言:javascript
运行
复制
Service.signup(String username, String password, Callback listener);

我编写了一个MockCallback来获得响应

代码语言:javascript
运行
复制
class MockCallback implements Callback {
   String res;
   public void done(String res) {
      this.res = res;
      this.notifyAll()
   }
}

我为它编写了一个测试用例,我必须等待Service.signup完成,以测试结果。

代码语言:javascript
运行
复制
MockCallback cb = new MockCallback();
sychronized(cb) {
   cb.wait();
   service.signup("foo", "bar", cb);
}
assertEquals(cb.res, "hello");

但是它不像我预期的那样工作,cb.resnull,它直接以service.signup的名字命名assertEquals(cb.res, "hello"),而不是我想要的,我如何修复它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-11 10:12:21

使用CountDownLatch

代码语言:javascript
运行
复制
class MockCallback implements Callback {
   private final CountDownLatch latch;
   String res;

   public MockCallback(CountDownLatch latch) { this.latch = latch; }

   public void done(String res) {
      this.res = res;
      latch.countDown();
   }
}

在您的测试用例中:

代码语言:javascript
运行
复制
CountDownLatch latch = new CountDownLatch();
MockCallback cb = new MockCallback(latch);
service.signup("foo", "bar", cb);
latch.await(); // wait for latch to count down
assertEquals(cb.res, "hello");
票数 0
EN

Stack Overflow用户

发布于 2014-07-11 11:16:46

您没有正确地使用等待/通知模式。

A. notifyAll()应该使用与wait()相同的监视器进行同步。

B.生产者调用(=())不应该在同步块中

C. wait()应该使用一个任务已完成的测试循环包装,在您的情况下,这个循环应该测试res != null。

D.,并且,让所有同步监视器成为最终结果是一个好主意。

就像这样:

代码语言:javascript
运行
复制
class MockCallback implements Callback {
   String res;
   public synchronized void done(String res) { //<----------- now synchronized
      this.res = res;
      this.notifyAll()
   }
}

final MockCallback cb = new MockCallback(); //<----------- make monitor obj final


service.signup("foo", "bar", cb); //<----------- call not synchronized

sychronized(cb) {
   while (cr.res == null) { //<------------- wait in loop and check completion condition
      cb.wait();
   }
}
assertEquals(cb.res, "hello");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24695109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档