Я использую 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
для загрузки текстур?
В libgdx Класс текстуры в основном обертывает дескриптор OpenGL Texture. Безголовый сервер не имеет контекста OpenGL (отсюда и «безголовый»). Вы не можете создать дескриптор OpenGL Texture без контекста OpenGL. – Xoppa
Хорошо, это имеет смысл. Я предполагаю, что это скорее общий вопрос Java, но знаете ли вы, как это можно сделать в модульных тестах? Может использоваться инъекция зависимостей, но передача каждой текстуры в качестве параметра звучит беспорядочно. – twiz
На данный момент я решил свою проблему, просто используя lwjgl вместо безголового бэкэнда. Это кажется противоречивым, поскольку я предполагаю, что модульное тестирование является основной целью существования безголового бэкэнда. Я понимаю, что фактическая безголовая реализация openGL будет бессмысленной, но разве не имеет смысла, если бы безгласный бэкэнд содержал макетную версию API для предотвращения исключений? – twiz