Joh*_*ohn 5 sockets service android unit-testing
我有一个Android服务,该服务通过通过TCP来回传递消息来处理与游戏同步服务器的通信。
我希望能够对这项服务的行为进行单元测试。即,当在线上看到数据时,将读取,解析数据并发送有效的对应意图,并且当服务接收到意图时,它将正确创建一条消息以发送到服务器。
我对单元测试不是特别擅长,但是我正在尝试使单元测试成为我实践的一部分。我不确定如何处理这样的事情。感觉好像我需要模拟套接字并伪造Input和Output流,但是我真的不知道该怎么做,特别是因为它适用于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();
}
}
Run Code Online (Sandbox Code Playgroud)
欢迎来到嘲笑的世界。您需要做的事情可以借助Android Mock轻松完成。您应该在项目的使用 Android Mock wiki 页面编写测试中了解 Expectations 如何与 Android Mock 配合使用。
我要做的是实现一个封装底层 TCP/套接字调用的 Socket 服务。然后使用 Android Mock,模拟 Socket 服务并使用 Expectations 来验证更高级别的方法(如 GameSyncService )传入的数据是否正确
归档时间: |
|
查看次数: |
4317 次 |
最近记录: |