单元测试多线程Api

时间:2013-07-16 17:17:42

标签: java concurrency junit4

我正在编写一个在工作线程上执行HTTP请求的Api,然后在完成时调用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?

1 个答案:

答案 0 :(得分:1)

嗯,我猜你的问题是因为你的方法fetchUser是一个asynchonous method而不是一个同步的方法,直到它完成它的工作才会返回。

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

IMO,CountdownLatch或更ReentrantLock及其Condition好友可以节省您的一天。可以使用Google轻松找到有关这两个工具的教程。祝你好运。

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