我正在为我的最后一年项目开发多人游戏,目前正在服务器领域工作。在服务器中,我正在处理运动区域,其工作方式如下
播放器进行移动 - > 将数据包发送到服务器,并提供移动详细信息 - > 服务器将移动排入队列中,该队列包含在播放器对象 - > 服务器继续循环连接所有连接的播放器 - > 服务器检查播放器的移动队列 - >服务器更新播放器的位置 - > 服务器将移动详细信息发送给其他客户端。
为了达到这个目的,我将使用名为MovementService的Runnables,它们将在其间分配玩家队列。可运行的数量取决于资源,因为在一个线程上排队每个玩家意味着很多延迟,因此将至少有4个可运行的或者可以说4个长运行的线程。这些runnable将被添加到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
。
答案 0 :(得分:1)
您可以使用模拟框架(EasyMock)来创建playerQueue的模拟,并添加对应该调用的内容的期望。 接下来的事情:
@Override
public void run() {
while(isRunning){
synchronized (playerQueue) {
playerQueue.forEach(player -> move(player));
}
}
}
这个while running
非常容易出错。
创建一个预定的线程池并提交此任务以某个固定的速率运行(例如10毫秒)并删除while(isRunning);您可以致电ScheduledFutute<?> future.cancel(false);