我正在尝试在处理程序中创建一个断言,但没有成功。我尝试用线程,runnables等执行它。下一个代码就是一个例子:
public class ServerTest extends AndroidTestCase {
private final String TAG = this.getClass().getSimpleName();
private final int ACK = 1;
public void testSendToServer(){
final ServerStub server = new ServerStub();
final CountDownLatch signal = new CountDownLatch(1);
new Thread(new Runnable() {
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
// This log never appear
Log.w(TAG, "handleMessage(Message "+msg+")");
assertEquals(ACK, msg.what);
signal.countDown();
return true;
}
});
@Override
public void run() {
// This log never appear
Log.w(TAG, "sentToServer()");
server.sentToServer(handler);
}
}).start();
try {
signal.await(15, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
//This assert fails
assertEquals(0, signal.getCount());
}
class ServerStub{
private final String TAG = this.getClass().getSimpleName();
public void sentToServer(Handler handler){
Message message = new Message();
message.what = ACK;
Log.i(TAG, "ACK_RECEIVED");
handler.sendMessage(message);
}
}
}
我想测试一个不返回任何内容的方法类,只是“做某事”并使用处理程序返回响应。
我执行下一个意图的测试用例testSendToServer()
:
在此测试中,创建了一个具有方法sentToServer(Handler handler)
的ServerStub。在此方法中,只需向处理程序发送“ACK”消息。
之后,我创建了CountDownLatch signal = new CountDownLatch(1);
来在处理程序signal.countDown();
方法中调用handleMessage(Message msg)
以了解它是否已执行。
继续测试,我创建了一个新的Thread,其中创建了一个Handler并调用了sentToServer(Handler handler)
。在处理程序内部也会调用assertEquals(ACK, msg.what);
,我需要知道ServerStub是否向我发送了“ACK”。
主线程正在等待15秒或执行signal.countDown();
。最后调用assertEquals(0, signal.getCount());
检查Handler是否已执行。
但是永远不会执行处理程序handleMessage(Message msg)
方法。
我读了其他帖子,我尝试了很多例子,但我从未找到答案。 有可能是这样吗?
更多信息: 现在我正在尝试在Thread中创建一个处理程序,如下所示:
new Thread() {
@Override
public void run() {
Log.w(TAG, "Thread run");
Handler handler = new Handler(new Handler.Callback() {
...
}
}
}.start();
打印日志“Thread run”但之后我得到“测试运行失败:由于'java.lang.RuntimeException'而导致Instrumentation运行失败”。