2

我正在编写一个 Api,它在工作线程上执行 HTTP 请求,然后在完成时调用 Callback-Handler 的方法。

public class GriklyClient <E,T>{

private final IHttpRequest<E,T> request;
private final ResponseListener<T> response;


protected GriklyClient (IHttpRequest<E,T> request,ResponseListener<T> response)
{
    this.request = request;
    this.response = response;
}



/**
 * Dispatch a thread to process
 * HTTP Request.
 */
public void execute ()
{
    Runnable thread = new Runnable() 
    {

        public void run() 
        {
            T result = (T) request.execute ();  
            response.response(result);
        }
    };
    new Thread(thread).start();
}//end execute method

}

这是对 ApI 的调用的样子:

 Grikly grikly = new Grikly(developerKey);
 grikly.addValidUserCredential(email,password);
 grikly.fetchUser(1, new ResponseListener<User>() {
        public void response(User result) {
            // TODO Auto-generated method stub
            System.out.println(result);
        }
    });

我遇到的问题是单元测试。回调处理程序没有在我的单元测试中被调用,因此我的所有测试总是通过,即使它们应该失败。

  private Grikly grikly = new Grikly (developerKey);
  @Test
public void fetchUser ()
{
    grikly.fetchUser(1, new ResponseListener<User>() {

        public void response(User result) {
            Assert.assertNotNull(result);

        }
    });
}//end fetchUser Test

如何编写单元测试来测试此 API?

4

1 回答 1

1

好吧,我想您的问题是因为您的方法fetchUser异步方法,而不是同步方法,它在完成工作之前不会返回。

因此,调用grikly.fetchUser(...将立即返回(没有任何失败或成功迹象的测试方法也是如此fetchUser()),而您在 GriklyClient 中创建的“孤独”线程将继续运行并通过调用您的回调方法来完成它的response工作new ResponseListener<User>and当然,当时没人在乎。

国际海事组织,无论是一个CountdownLatch或一个更普遍ReentrantLockCondition伙伴,都可以节省您的时间。使用 Google 可以轻松找到有关这两个工具的教程。祝你好运。

编辑:
再想一想,如果您想测试传递给回调方法的结果,可能需要将它从您创建的新线程传递(或发布)到测试主线程(通过将其保存到锁受保护的或易变的装饰字段)并在带@Test注释的方法中对其进行测试,在您的情况下是fetchUser().

于 2013-09-20T16:53:36.430 回答