问题 libgdx使用类的单元测试


我正在写一个关于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组件而不创建整个应用程序对象? 谢谢。

编辑

回过头来看(感谢评论中的Sam),我意识到需要GL访问(加载资产需要它),但这种方法似乎不起作用:图形库似乎没有被初始化。 GDX文档没有帮助。任何线索?


11002
2018-04-10 09:33


起源

使用您概述的方法,我能够使用文件处理但不能使用任何图形模块 - 大概是因为它都运行单独的渲染线程。我意识到你的目的不是测试图形,但是你有没有办法在单元测试中调用图形模块?任何帮助非常感谢! - Cabbage soup
是的,上面的方法工作,但实际上创建一个空的主窗口。我认为你可以执行整个游戏操作,因为情况就是这样:我将为其中一个屏幕添加测试并检查它。 - Calimar41
事实上,当我从Gdx.gl访问任何东西时,我的测试失败了 - 显然,上述内容不足以初始化GL部分。我正在进一步调查 - 我的部分测试涉及纹理加载,所以我也需要它! - Calimar41
为什么不使用模拟呢?选择:mockito + powermock,jmockit,easy mock等。您可以根据需要在测试用例中轻松模拟libgdx行为,从而验证组件的行为方式。 - Morfic
我的部分问题来自libgdx javadoc缺乏的事实;我不确定我是否使用了正确的方法(例如:我试图通过getTextures()从TextureAtlas中提取区域,这破坏了我的代码)。嘲笑 - 我几乎没有经验 - 似乎假设我知道实际的方法应该返回什么;如果是这样的话,我会根据未经验证的假设测试我的代码。如果这是有道理的。如我错了请纠正我。 - Calimar41


答案:


这个问题没有得到解答,我很惊讶没有人指出这个问题 无头后端,这是这种情况的理想选择。将此与您最喜爱的模拟库相结合,您应该很高兴。

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);
    }
}

11
2018-06-09 10:02



该死的。正是我需要的!谢谢。 - Calimar41
要将其与JUnit测试结合使用,您可以使用 GdxTestRunner 从 github.com/TomGrill/gdx-testing。 - Thomas


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

如果您在编写依赖于OpenGL上下文的测试时遇到问题,请记住这一点 OpenGL只附加到您的LwjglApplication的线程,这不是您的测试的一部分。你的测试必须打电话 Gdx.app.postRunnable(Runnable r) 使用OpenGl上下文访问该线程。

你可能想用 synchronized 和 CountDownLatch 在等待应用程序执行命令时暂停测试。


2
2017-12-23 22:30



我正在尝试做这件事,但我无法回复到junit(我对java很新)。似乎CountDownLatch是一种保持Gdx.app和junit线程同步的方法 - 有没有办法在Runnable代码中检测通过/失败?即,junit assert在Gdx.app线程中的s不会影响junit线程,因此junit线程需要检测Runnable代码中发生的事情。你知道怎么做的吗? - SheerSt
我想告诉你,这可以作为一个新的问题而不是评论,但是我看到你同时已经问过并得到了帮助:-)如果有人对这个评论有误,请参阅: stackoverflow.com/questions/32492526/... - Sebastian