2014-09-01 8 views
7

Я использую LibGDX headless backend для запуска тестов jUnit. Это хорошо работает для определенных тестов, но если я попытаюсь создать new Texture('myTexture.png');, я получаю исключение NullPointerException. Точная ошибка:Создание текстуры в модульных модульных тестах LibGDX

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

Для простоты, я создал метод, который не делает ничего, кроме загрузки текстуры:

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

Тогда мой тестовый класс выглядит следующим образом:

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

Этот метод работает правильно в моем реальном приложении, только не в модульных тестах.

Как использовать класс HeadlessApplication для загрузки текстур?

+0

В libgdx Класс текстуры в основном обертывает дескриптор OpenGL Texture. Безголовый сервер не имеет контекста OpenGL (отсюда и «безголовый»). Вы не можете создать дескриптор OpenGL Texture без контекста OpenGL. – Xoppa

+0

Хорошо, это имеет смысл. Я предполагаю, что это скорее общий вопрос Java, но знаете ли вы, как это можно сделать в модульных тестах? Может использоваться инъекция зависимостей, но передача каждой текстуры в качестве параметра звучит беспорядочно. – twiz

+2

На данный момент я решил свою проблему, просто используя lwjgl вместо безголового бэкэнда. Это кажется противоречивым, поскольку я предполагаю, что модульное тестирование является основной целью существования безголового бэкэнда. Я понимаю, что фактическая безголовая реализация openGL будет бессмысленной, но разве не имеет смысла, если бы безгласный бэкэнд содержал макетную версию API для предотвращения исключений? – twiz

ответ

7

насмешливый Gdx.gl помочь мне решить эту NullPointerException во время создания текстуры:

import static org.mockito.Mockito.mock; 

...

Gdx.gl = mock(GL20.class); 

Я использовал его с GdxTestRunner см 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

Билл - спасибо, жаль, что я не видел раньше. – jwehrle

Смежные вопросы