Unit-тестирование классов, использующих libgdx

Я пишу игру над libgdx; Я использую junit framework для упрощения модульного тестирования моего кода. Теперь есть часть кода (генератор карт, класс, преобразующий мой собственный формат карты в TiledMap...), который мне нужно тщательно протестировать, но он использует код libgdx: от обработки файлов до загрузки активов. Я не планирую проверять фактический графический вывод или саму игру таким образом: но я хочу протестировать отдельные компоненты (расчет, доступ к ресурсам...), чтобы избежать вопиющих ошибок.

Я попытался сделать что-то подобное в методе setUpBeforeClass:

    LwjglApplicationConfiguration cfg = new LwjglApplicationConfiguration();
    cfg.useGL20 = true;
    cfg.width = 480;
    cfg.height = 320;
    cfg.resizable = true;
    LwjglApplication app = new LwjglApplication( new TestApplicationListener(), cfg);

И вызов внутри tearDownAfterClass():

    Gfx.app.exit()

Но он создает окно, которое мне не нужно, и кажется излишним, когда все, что мне нужно, это инициализация файлов. Есть ли лучший способ инициализировать компоненты libGDX без создания всего объекта приложения? Спасибо.

ИЗМЕНИТЬ

Возвращаясь к нему (спасибо Сэму в комментариях), я понимаю, что необходим доступ к GL (для этого требуется загрузка активов), но этот подход, похоже, не работает: графическая библиотека, похоже, не инициализируется. Документация GDX не помогла. Любая подсказка?

Ответ 1

На этот вопрос не ответил, и я удивлен, что никто не указал на безголовый бэкэнд, который идеально подходит для этой ситуации. Объедините это с вашей любимой издевательской библиотекой, и вам должно быть хорошо идти.

public class HeadlessLauncher {
    public static void main(final String[] args) {
        final HeadlessApplicationConfiguration config = new HeadlessApplicationConfiguration();
        config.renderInterval = Globals.TICK_RATE; // Likely want 1f/60 for 60 fps
        new HeadlessApplication(new MyApplication(), config);
    }
}

Ответ 2

Как уже было показано, есть бэкэнд HeadlessApplication, который дает вам инициализированный libGDX, но не имеет контекста OpenGL. Для работы с OpenGL вам действительно нужен бэкэнд LwjglApplication, который создает окно OpenGL.

Если у вас возникли проблемы с написанием тестов, которые полагаются на контекст OpenGL, имейте в виду, что OpenGL привязан только к потоку вашего LwjglApplication, который не является протектором ваших тестов. Ваши тесты должны вызвать Gdx.app.postRunnable(Runnable r) для доступа к потоку с контекстом OpenGl.

Вы можете использовать synchronized и CountDownLatch, чтобы приостановить тестирование, ожидая, пока ваше приложение выполнит команду.