【发布时间】:2014-05-23 22:17:46
【问题描述】:
我正在通过 libgdx 编写游戏;我正在使用 junit 框架来简化我的代码的单元测试。 现在有一部分代码(地图生成器,一个将我自己的地图格式转换为 TiledMap 的类......)我需要彻底测试,但它使用 libgdx 代码:从文件处理到资产加载。 我不打算以这种方式测试实际的图形输出或游戏本身:但我想测试单个组件(计算、资产访问......)以避免明显的错误。
我尝试在“setUpBeforeClass”方法中做这样的事情:
LwjglApplicationConfiguration cfg = new LwjglApplicationConfiguration();
cfg.useGL20 = true;
cfg.width = 480;
cfg.height = 320;
cfg.resizable = true;
LwjglApplication app = new LwjglApplication( new TestApplicationListener(), cfg);
并在 tearDownAfterClass() 中调用:
Gfx.app.exit()
但它确实创建了一个我不需要的窗口,而且当我只需要初始化文件处理时,它似乎有点过分了。有没有更好的方法来初始化 libGDX 组件而不创建整个应用程序对象? 谢谢。
编辑
回顾它(感谢 cmets 中的 Sam),我意识到需要 GL 访问(加载资产需要它),但这种方法似乎不起作用:图形库似乎没有被初始化。 GDX 文档没有帮助。有什么线索吗?
【问题讨论】:
-
使用您概述的方法,我可以使用文件处理,但不能使用任何图形模块 - 大概是因为它都运行单独的渲染线程。我意识到您的目标不是测试图形,但是您是否遇到过在单元测试中调用图形模块的方法?非常感谢任何帮助!
-
是的,上面的方法有效,但实际上创建了一个空的主窗口。我假设您可以执行整个游戏操作,因为情况是这样:我将为其中一个屏幕添加一个测试并检查它。
-
事实上,从 Gdx.gl 访问任何内容时,我的测试都失败了 - 显然,以上内容不足以初始化 GL 部分。我正在进一步调查 - 我的部分测试涉及纹理加载,所以我也需要它!
-
那为什么不使用模拟呢?任君选择:mockito + powermock、jmockit、easy mock 等。您可以根据测试用例的需要轻松模拟 libgdx 行为,从而验证组件的行为方式。
-
我的部分问题来自缺少 libgdx javadoc 的事实;我不确定我是否使用了正确的方法(例如:我试图通过 getTextures() 从 TextureAtlas 中提取区域,这破坏了我的代码)。模拟 - 我几乎没有经验 - 似乎假设我知道实际方法应该返回什么;如果是这样的话,我会根据未经验证的假设来测试我的代码。如果这是有道理的。如果我错了,请纠正我。
标签: java unit-testing junit libgdx