【问题标题】:Unit Testing Libgdx classes that call a ShaderProgram (such as a Stage) via a HeadlessApplication通过 HeadlessApplication 调用 ShaderProgram(例如舞台)的 Libgdx 类的单元测试
【发布时间】:2018-08-07 13:51:27
【问题描述】:

我正在尝试对我的 libgdx 应用程序的 core 包进行单元测试。

模拟ShaderProgram 以便可以测试根类的最佳方法是什么?

鉴于 Libgdx 测试运行程序的以下初始化,

init {
    val conf = HeadlessApplicationConfiguration()

    HeadlessApplication(this, conf)
    Gdx.gl = mock(GL20::class.java) 
    Gdx.gl20 = mock(GL20::class.java)
    Gdx.gl30 = mock(GL30::class.java)
    Gdx.graphics = mock(Graphics::class.java)
    `when`(Gdx.graphics.height).thenReturn(dimensions)
    `when`(Gdx.graphics.width).thenReturn(dimensions)
}

以及被测函数(在Application Listener的子类中),

override fun create() {
    ...
    stage = Stage(ScreenViewport())
    ...
}

Stage 在尝试编译着色器时发生错误。

即,在SpriteBatch.java 中来自com.badlogic.gdx.graphics.g2d

ShaderProgram shader = new ShaderProgram(vertexShader, fragmentShader);
if (shader.isCompiled() == false) throw new IllegalArgumentException("Error compiling shader: " + shader.getLog());

shader.isCompiled() 似乎总是为 HeadlessApplication 返回 false。

【问题讨论】:

    标签: unit-testing kotlin libgdx


    【解决方案1】:

    由于目前还没有答案,我想分享我目前的知识/观点:

    首先,我们需要问一个问题:我们甚至可以为一般的 GUI 编写单元测试吗?如果您想获得深入的答案,请查看this question。总结一下:您可以通过从帧缓冲区计算哈希来对您的 GUI 进行单元测试,但一般建议是将尽可能多的逻辑移出您的 GUI,并且根本不要对您的 GUI 进行单元测试。除此之外,我和大多数运行代码的服务器都没有对 OpenGL 的硬件支持。假设我们不想打扰 Softwarerendering,那么对 GUI 本身进行单元测试是没有选择的。

    根据这些信息,我认为我的逻辑与我的 GUI 分离得不够好。但是,当进一步研究scene2d 和围绕它的许多教程时,很明显scene2d 希望您通过设计将代码的逻辑和GUI 部分结合起来,请参阅this question 以供参考。

    假设您同意 scene2d 使您的逻辑和 GUI 很难分离的观点,我们现在面临操作员的问题,而常见的解决方案不适用。

    在我看来,libGDX 的所有元素都应该与 HeadlessBackend 完全兼容,而不是 libGDX 的设计缺陷。到目前为止,我想出的唯一解决方法是在需要时模拟 SpriteBatch 并将其传递给舞台:

    val stage = Stage(myViewport, if (isHeadless) mock(SpriteBatch::class.java) else SpriteBatch())
    

    虽然这允许您正常使用 Stage,但我不认为这是一个真正的解决方案,因为您需要编写代码测试意识。

    【讨论】:

      猜你喜欢
      • 2014-05-23
      • 2019-03-23
      • 1970-01-01
      • 2015-09-21
      • 1970-01-01
      • 2017-12-22
      • 2023-03-27
      • 1970-01-01
      • 2013-11-30
      相关资源
      最近更新 更多