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
, чтобы приостановить тестирование, ожидая, пока ваше приложение выполнит команду.