Java 单元测试多线程Api
我正在编写一个Api,它在工作线程上执行HTTP请求,然后在完成时调用回调处理程序的方法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
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()