【问题标题】:Unit-testing of libgdx-using classes使用 libgdx 的类的单元测试
【发布时间】: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


【解决方案1】:

这个问题没有得到回答,我很惊讶没有人指出headless backend,它非常适合这种情况。将它与你最喜欢的模拟库结合起来,你应该很高兴。

public class HeadlessLauncher {
    public static void main(final String[] args) {
        final HeadlessApplicationConfiguration config = new HeadlessApplicationConfiguration();
        config.renderInterval = Globals.TICK_RATE; // Likely want 1f/60 for 60 fps
        new HeadlessApplication(new MyApplication(), config);
    }
}

【讨论】:

  • 该死的。正是我需要的!!谢谢。
  • 要将其与 JUnit 测试结合使用,您可以使用 GdxTestRunner from github.com/TomGrill/gdx-testing
【解决方案2】:

如前所述,有一个 HeadlessApplication 后端,它为您提供了一个初始化的 libGDX,但没有 OpenGL 上下文。要使用 OpenGL,您确实需要创建 OpenGL 窗口的 LwjglApplication 后端。

如果您在编写依赖于 OpenGL 上下文的测试时遇到问题,请记住 OpenGL is only attached to the thread of your LwjglApplication which is not the tread of your tests。您的测试必须调用 Gdx.app.postRunnable(Runnable r) 才能使用 OpenGL 上下文访问线程。

您可能希望使用synchronizedCountDownLatch 来暂停测试,同时等待您的应用程序执行命令。

【讨论】:

  • 我正在尝试做这件事,但无法与 junit 通信(我对 java 还很陌生)。似乎 CountDownLatch 是一种保持 Gdx.app 和 junit 线程同步的方法 - 有没有办法检测 Runnable 代码中的通过/失败?即Gdx.app线程中的junitasserts不会影响junit线程,所以junit线程需要检测Runnable代码中发生了什么。你知道这样做的方法吗?
  • 我想告诉你,这将是一个新问题而不是评论,但我看到同时你已经问过并且得到了帮助 :-) 如果有人对此评论存有疑问,见:stackoverflow.com/questions/32492526/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
相关资源
最近更新 更多