Vraag Unit-testing van klassen die libgdx gebruiken


Ik schrijf een spel over libgdx; Ik gebruik het junit-framework om het testen van mijn code eenvoudiger te maken. Nu is er een deel van de code (een kaartgenerator, een klasse die mijn eigen kaartformaat converteert naar TiledMap ...) die ik grondig moet testen, maar het maakt gebruik van libgdx-code: van bestandsverwerking tot activabelasting. Ik ben niet van plan om de daadwerkelijke grafische uitvoer of het spel zelf op deze manier te testen: maar ik wil de afzonderlijke componenten testen (berekening, toegang tot activa ...) om flagrante fouten te voorkomen.

Ik heb geprobeerd om zoiets als dit te doen in de "setUpBeforeClass" -methode:

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

En bellen binnen tearDownAfterClass ():

    Gfx.app.exit()

Maar het creëert wel een venster dat ik niet nodig heb, en het lijkt overdreven wanneer ik alleen de bestandsafhandeling geïnitialiseerd heb. Is er een betere manier om de libGDX-componenten te initialiseren zonder een volledig toepassingsobject te maken? Bedankt.

BEWERK

Terugkomend op het commentaar (dankzij Sam in de reacties), realiseer ik me dat toegang tot GL vereist is (laden van items vereist dit), maar deze benadering lijkt niet te werken: de grafische bibliotheek lijkt niet geïnitialiseerd te zijn. GDX-documentatie heeft niet geholpen. Enig idee?


11
2018-04-10 09:33


oorsprong


antwoorden:


Deze vraag is niet beantwoord en ik ben verrast dat niemand heeft gewezen op de headless backend, wat ideaal is voor deze situatie. Combineer dit met je favoriete spotbibliotheek en je moet goed zijn om te gaan.

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

11
2018-06-09 10:02



Zoals reeds aangetoond is er een Headless Application-backend die u een geïnitialiseerde libGDX geeft maar geen OpenGL-context heeft. Voor het werken met OpenGL hebt u inderdaad de LwjglApplication-backend nodig die een OpenGL-venster maakt.

Als u problemen ondervindt met het schrijven van tests die afhankelijk zijn van de OpenGL-context, moet u dat in gedachten houden OpenGL is alleen gekoppeld aan de thread van uw LwjglApplication, wat niet het loopvlak van uw tests is. Je tests moeten bellen Gdx.app.postRunnable(Runnable r) om toegang te krijgen tot de thread met de OpenGl-context.

Misschien wilt u gebruiken synchronized en CountDownLatch om de test te pauzeren terwijl u wacht tot uw toepassing de opdracht uitvoert.


2
2017-12-23 22:30