2014-09-01 41 views
7

Używam LibGDX headless backend do uruchamiania testów jUnit. Działa to dobrze w przypadku niektórych testów, ale jeśli próbuję utworzyć new Texture('myTexture.png');, otrzymuję wyjątek NullPointerException. Dokładny błędu:Tworzenie tekstury w bezgłowych testach jednostki LibGDX

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

Aby zachować rzeczy proste, stworzyłem metodę, która robi nic innego niż załadować Tekstura:

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

Wtedy, moja klasa Test wygląda następująco:

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

Ta metoda działa poprawnie w mojej aplikacji, ale nie w testach jednostkowych.

Jak mogę użyć klasy HeadlessApplication do załadowania tekstur?

+0

The Klasa teksturowa libgdx zasadniczo opakowuje uchwyt tekstury OpenGL. Bezgłowy backend nie ma kontekstu OpenGL (stąd "bezgłowy"). Nie można utworzyć uchwytu tekstury OpenGL bez kontekstu OpenGL. – Xoppa

+0

OK, to ma sens. Sądzę, że jest to raczej ogólne pytanie w języku Java, ale czy znasz dobry sposób na radzenie sobie z tym w testach jednostkowych? Można użyć iniekcji zależności, ale przekazywanie każdej tekstury jako parametru brzmi nieporządnie. – twiz

+2

Na razie rozwiązałem mój problem, używając tylko lwjgl zamiast bezgłowego backendu. Wydaje się to być sprzeczne z intuicją, ponieważ zakładam, że testowanie jednostkowe jest głównym celem istnienia bezgłowego backendu. Rozumiem, że rzeczywista bezgłowa implementacja OpenGL byłaby bezcelowa, ale czy nie miałoby sensu, aby bezgłowy backend zawierał fałszywą wersję API, aby zapobiec wyjątkom? – twiz

Odpowiedz

7

drwi z Gdx.gl mi pomóc rozwiązać ten NullPointerException podczas tworzenia Tekstura:

import static org.mockito.Mockito.mock; 

...

Gdx.gl = mock(GL20.class); 

użyłem go z GdxTestRunner patrz 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 - dzięki, żałuję, że nie widziałem wcześniej. – jwehrle