2014-09-01 20 views
7

Sto utilizzando lo LibGDX headless backend per eseguire i test jUnit. Funziona bene per alcuni test, ma se provo a creare un new Texture('myTexture.png');, ottengo un NullPointerException. L'errore esatto è:Creazione di texture nei test delle unità libGDX senza testa

java.lang.NullPointerException 
at com.badlogic.gdx.graphics.GLTexture.createGLHandle(GLTexture.java:207) 
... 

Per semplificare le cose, ho creato un metodo che non fa altro che caricare una texture:

public class TextureLoader { 
    public Texture load(){ 
     return new Texture("badlogic.jpg"); 
    } 
} 

Poi, la mia classe di test è simile al seguente:

public class TextureTest { 

    @Before 
    public void before(){ 
     final HeadlessApplicationConfiguration config = new HeadlessApplicationConfiguration(); 
     new HeadlessApplication(new ApplicationListener() { 
      // Override necessary methods 
      ... 
     }, config); 
    } 

    @Test 
    public void shouldCreateTexture() { 
     TextureLoader loader = new TextureLoader(); 
     assertNotNull(loader.load()); 
    } 
} 

Questo metodo funziona correttamente nella mia app effettiva, ma non nei test di unità.

Come è possibile utilizzare la classe HeadlessApplication per caricare Textures?

+0

Il La classe di texture libgdx fondamentalmente avvolge un handle di texture OpenGL. Il backend senza testa non ha alcun contesto OpenGL (da qui il "senza testa"). Non è possibile creare un handle Texture OpenGL senza contesto OpenGL. – Xoppa

+0

Ok, questo ha senso. Immagino che si tratti più di una domanda java generale, ma conosci un buon modo per gestirlo nei test unitari? L'iniezione di dipendenza potrebbe essere utilizzata, ma passare ogni trama come parametro suona disordinato. – twiz

+2

Per ora, ho risolto il mio problema usando solo lwjgl invece del backend senza testa. Ciò sembra controintuitivo, poiché presumo che il test unitario sia lo scopo principale dell'esistenza di un backend senza testa. Comprendo che un'implementazione openGL senza headless sarebbe inutile, ma non avrebbe senso che il backend headless contenga una versione simulata dell'API per evitare eccezioni? – twiz

risposta

7

Mocking il Gdx.gl aiutarmi risolto questo NullPointerException durante la creazione Struttura:

import static org.mockito.Mockito.mock; 

...

Gdx.gl = mock(GL20.class); 

ho usato con GdxTestRunner, vedere https://bitbucket.org/TomGrill/libgdx-testing-sample

public GdxTestRunner(Class<?> klass) throws InitializationError { 
    super(klass); 
    HeadlessApplicationConfiguration conf = new HeadlessApplicationConfiguration(); 

    new HeadlessApplication(this, conf); 
    Gdx.gl = mock(GL20.class); // my improvement 
} 
+0

Bill - grazie, vorrei aver visto prima. – jwehrle