我有一个Android服务,通过来回传递消息来处理与游戏同步服务器的通信.
我希望能够对这项服务的行为进行单元测试.也就是说,当在线上看到数据时,读取,解析数据并发出有效的相应意图,并且当服务接收到Intent时,它正确地创建要发送到服务器的消息.
我不是特别擅长单元测试,但我正在尝试将单元测试作为我练习的一部分.我不确定如何处理这样的事情.感觉就像某种程度上我需要模拟套接字并伪造输入和输出流,但我真的不知道如何做到这一点,特别是因为它适用于AndroID.
这是(大大减少了严重性)服务:
public class GameSyncService extends Service { Thread minputThread = new Thread() { /** * Parse commands from a message string, broadcast the command intents, and * return the remainder of the message * @param message The message to parse for commands * @returns the remaining characters */ private String parseCommands(String message) { // Parse the command, broadcast the Intent and return any remainder } @OverrIDe public voID run() { String message = ""; int charsRead = 0; char [] buffer = new char[BUFFER_SIZE]; while(!Thread.interrupted()) { try { while ((charsRead = mIn.read(buffer)) != -1) { message += new String(buffer).substring(0, charsRead); message = parseCommands(message); } } catch (IOException e) { Log.d(LOG_TAG, "Error receiving response: " + e.getLocalizedMessage()); disconnectFromServer(); connectToServer(); } } } }; private broadcastReceiver mMessageSender = new broadcastReceiver() { @OverrIDe public voID onReceive(Context context, Intent intent) { String message = intent.getStringExtra("message"); sendMessage(message); } }; @OverrIDe public IBinder onBind(Intent arg0) { return null; } private voID sendMessage(String message) { new SendCommandMessageTask().execute(message); } /** * Create a new connection to the server */ private voID connectToServer() { try { if (mSocket == null) { mSocket = new Socket(mHost, mPort); mOut = new PrintWriter(mSocket.getoutputStream()); mIn = new BufferedReader(new inputStreamReader(mSocket.getinputStream()), BUFFER_SIZE); sendMessage("Handshake:|" + pInfo.versionname); } } catch (IOException e) { e.printstacktrace(); } } /** * disconnect from the server and reset the socket to null */ private voID disconnectFromServer() { if (mSocket != null) { try { mIn.close(); mOut.close(); mSocket.close(); mSocket = null; } catch (IOException e) { e.printstacktrace(); } } } @OverrIDe public int onStartCommand(Intent i, int flags, int startID) { Log.d(LOG_TAG, "GameSyncService Started"); mHost = i.getStringExtra("host"); mPort = i.getIntExtra("port", 9000); connectToServer(); minputThread.start(); return START_STICKY; } @OverrIDe public voID onCreate() { registerReceiver(mMessageSender, new IntentFilter(COMMAND_MESSAGE_SEND_ACTION)); try { pInfo = getPackageManager().getPackageInfo(getPackagename(), 0); } catch (nameNotFoundException e) { e.printstacktrace(); } super.onCreate(); } @OverrIDe public voID onDestroy() { unregisterReceiver(mMessageSender); super.onDestroy(); }}
解决方法:
欢迎来到嘲弄的世界.您需要做的事情可以在Android Mock的帮助下轻松完成.您应该在项目的Writing Tests using Android Mock维基页面上阅读Expectations如何与AndroID Mock一起使用.
我要做的是实现一个封装底层TCP /套接字调用的Socket服务.然后使用AndroID Mock,您可以模拟您的Socket服务并使用Expectations来验证是否通过更高级别的方法传递了正确的数据(如GameSyncService)
总结以上是内存溢出为你收集整理的如何UnitTest依赖于网络连接的Android服务全部内容,希望文章能够帮你解决如何UnitTest依赖于网络连接的Android服务所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)