Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单元测试多线程Api_Java_Concurrency_Junit4 - Fatal编程技术网

Java 单元测试多线程Api

Java 单元测试多线程Api,java,concurrency,junit4,Java,Concurrency,Junit4,我正在编写一个Api,它在工作线程上执行HTTP请求,然后在完成时调用回调处理程序的方法 public class GriklyClient <E,T>{ private final IHttpRequest<E,T> request; private final ResponseListener<T> response; protected GriklyClient (IHttpRequest<E,T> request,ResponseLi

我正在编写一个Api,它在工作线程上执行HTTP请求,然后在完成时调用回调处理程序的方法

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

}
public类GriklyClient{
私人最终IHttpRequest请求;
私人最终回应听者回应;
受保护的GriklyClient(IHttpRequest请求、ResponseListener响应)
{
this.request=请求;
这个。反应=反应;
}
/**
*分派一个线程来处理
*HTTP请求。
*/
公共作废执行()
{
Runnable线程=新的Runnable()
{
公开募捐
{
T result=(T)request.execute();
回应。回应(结果);
}
};
新线程(Thread.start();
}//结束执行方法
}
对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);
        }
    });
Grikly Grikly=newgrikly(developerKey);
grikly.addValidUserCredential(电子邮件、密码);
grikly.fetchUser(1,新的ResponseListener(){
公共无效响应(用户结果){
//TODO自动生成的方法存根
系统输出打印项次(结果);
}
});
我遇到的问题是单元测试。在我的单元测试中没有调用回调处理程序,因此我的所有测试总是通过,即使它们应该失败

  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
private Grikly Grikly=新Grikly(developerKey);
@试验
公共用户()
{
grikly.fetchUser(1,新的ResponseListener(){
公共无效响应(用户结果){
Assert.assertNotNull(结果);
}
});
}//最终用户测试

我如何编写一个单元测试来测试这个Api?

好吧,我想你这里的问题是因为你的方法
fetchUser
是一个同步的方法,在完成它的工作之前不会返回

因此,
grikly.fetchUser(…
的调用将立即返回(测试方法
fetchUser()
w/w没有任何失败或成功的迹象),而您在GriklyClient中创建的“孤独”线程将继续运行,并通过调用
新ResponseListener
中的回调方法
response
完成其任务,当然,当时没有人关心

在我看来,无论是
CountdownLatch
还是更通用的
ReentrantLock
及其
条件
好友都可以帮你节省时间。关于这两种工具的教程可以在谷歌上轻松找到。祝你好运

编辑:
再想一想,如果您想测试传递给回调方法的结果,可能需要将其从您创建的新线程传递(或发布)到测试主线程(通过将其保存到锁保护的或易失性修饰的字段),并在
@test
注释方法中测试它,在您的例子中,该方法是
fetchUser()