【发布时间】:2015-11-06 21:15:02
【问题描述】:
我正在为我最后一年的项目开发一款多人游戏,目前正在开发服务器领域。在服务器中,我正在处理如下工作的移动区域
玩家进行移动 -> 将包含移动细节的数据包发送到服务器 -> 服务器将移动排队在包含在玩家对象内的队列中-> 服务器循环遍历所有连接的玩家 -> 服务器检查玩家的移动队列 -> 服务器更新玩家的位置 ->服务器将移动细节发送给其他客户端。
因此,为了实现这一点,我将拥有一个名为 MovementService 的 Runnable,它会在它们之间分配玩家队列。 runnable 的数量取决于资源,因为将每个玩家排队在一个线程上意味着很多延迟,因此至少会有 4 个 runnables,或者可以说是 4 个长时间运行的线程。这些可运行对象将被添加到 FixedThreadPool。
现在我的问题是我将如何测试这个实现,因为这是一个长期运行的线程,我不确定我将如何测试它,因为我之前发布了一个类似的问题,但答案建议我改变我的整个设计. Here 是个问题。答案中给出的方法无法在此处实现,因为我无法继续将服务器上收到的每个移动数据包的短可运行文件提交到 ThreadPool。
我的问题是我应该如何测试这个 Runnable 实现。有没有其他或更好的方法?
这是我的运动服务的相关代码
public class DefaultMovementService implements MovementService{
@Override
public void run() {
while(isRunning){
synchronized (playerQueue) {
playerQueue.forEach(player -> move(player));
}
}
}
private void move(Player player) {
//If player tank has movement, move the tank.
//Send the movement to the other clients on the same map
}
}
MovementService 接口扩展Runnable。
【问题讨论】:
-
我认为正确的方法是你不测试
Runnable,它已经工作了。您在可运行文件之外的测试工具中测试playerQueue。 -
你在哪里从 playerQueue 弹出任何东西?
-
当玩家退出时,我在服务中有个方法 void removePlayer(Player player)。这可以完成工作。我这里没有将它包含在我的代码中。
标签: java multithreading unit-testing server