我正在为我的最后一年项目开发一款多人游戏,目前正在服务器领域工作。在服务器中,我正在处理移动区域,其工作方式如下
玩家进行移动->一个数据包被发送到服务器,其中包含移动的详细信息->服务器将移动排入包含在玩家对象内的队列中>该服务器在所有连接的玩家中保持循环>>Server检查玩家的移动队列->Server更新玩家的位置->服务器将移动详细信息发送给其他客户端。
因此,为了实现这一点,我将拥有名为MovementService的Runnables,它将在玩家之间分布玩家队列。可运行的数量取决于资源,因为在一个线程上为每个玩家排队意味着有很多滞后,所以至少会有4个可运行的线程,或者可以说是4个长时间运行的线程。这些可运行文件将被添加到FixedThreadPool中。
现在我的问题是,我将如何测试这个实现,因为这是一个长时间运行的线程,我不确定我将如何进行测试,因为我之前发布了一个类似的问题,但答案建议我更改整个设计。问题来了。答案中给出的方法不能在这里实现,因为我不能一直向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
}
}
CCD_ 1接口扩展了CCD_。
您可以使用mocking框架(EasyMock)创建playerQueue的mock,并添加对应该调用的内容的期望。下一件事:
@Override
public void run() {
while(isRunning){
synchronized (playerQueue) {
playerQueue.forEach(player -> move(player));
}
}
}
这个while running
对于这个任务是非常容易出错的方法。创建一个计划线程池,并提交此任务以某个固定速率运行(例如10毫秒),然后删除while(isRunning);您可以通过调用ScheduledFutute<?> future.cancel(false);
来取消计划任务