我正在编写一个在工作线程上执行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?
答案 0 :(得分:1)
嗯,我猜你的问题是因为你的方法fetchUser
是一个asynchonous method而不是一个同步的方法,直到它完成它的工作才会返回。
因此,grikly.fetchUser(...
的调用将立即返回(测试方法fetchUser()
也没有任何失败或成功的迹象),而您在GriklyClient中创建的“孤独”线程将保持不变通过调用response
中的回调方法new ResponseListener<User>
来运行并完成其工作,当然,当时没有人关心。
IMO,CountdownLatch
或更ReentrantLock
及其Condition
好友可以节省您的一天。可以使用Google轻松找到有关这两个工具的教程。祝你好运。
编辑:
再想一想,如果您想测试传递给回调方法的结果,可能需要将它从您创建的新线程传递(或发布)到测试主线程(通过将其保存到锁定保护或不稳定的装饰字段)并在@Test
带注释的方法中对其进行测试,在您的情况下为fetchUser()
。