通过HeadlessApplication调用ShaderProgram(例如Stage)的单元测试Libgdx类

时间:2018-08-07 13:51:28

标签: unit-testing kotlin libgdx

我正在尝试对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的{​​{1}}中,

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()总是返回false。

1 个答案:

答案 0 :(得分:1)

由于到目前为止没有答案,我想分享一下我目前的知识/观点:

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

基于此信息,我认为我的逻辑与GUI的分离不够充分。但是,当深入研究scene2d及其周围的许多教程时,很明显,scene2d希望通过设计将代码的逻辑和GUI部分结合起来,请参见this question以供参考。

假设您认为场景2d很难分离逻辑和GUI,那么我们现在面临操作员的问题,而通用解决方案不适用。

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

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

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