2014-09-01 5 views
7

मैं जुनीट परीक्षण चलाने के लिए LibGDX headless backend का उपयोग कर रहा हूं। यह कुछ परीक्षणों के लिए अच्छा काम करता है, लेकिन अगर मैं new Texture('myTexture.png'); बनाने का प्रयास करता हूं, तो मुझे एक NullPointerException मिलता है। सटीक त्रुटि है:हेडलेस लिबडएक्स यूनिट परीक्षणों में बनावट बनाना

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 संदर्भ के बिना ओपनजीएल बनावट हैंडल नहीं बना सकते हैं। – Xoppa

+0

ठीक है, यह समझ में आता है। मुझे लगता है कि यह एक सामान्य जावा प्रश्न का अधिक है, लेकिन क्या आप यूनिट परीक्षणों में इसे संभालने के लिए एक अच्छा तरीका जानते हैं? निर्भरता इंजेक्शन का उपयोग किया जा सकता है, लेकिन पैरामीटर के रूप में प्रत्येक बनावट में गुजरने से गन्दा लगता है। – twiz

+2

अभी के लिए, मैंने हेडलेस बैकएंड के बजाय lwjgl का उपयोग करके मेरी समस्या हल कर ली है। यह काउंटर-अंतर्ज्ञानी लगता है, क्योंकि मुझे लगता है कि इकाई परीक्षण एक हेडलेस बैकएंड के अस्तित्व के लिए मुख्य उद्देश्य है। मैं समझता हूं कि एक वास्तविक हेडलेस ओपनजीएल कार्यान्वयन व्यर्थ होगा, लेकिन अपवादों को रोकने के लिए एडीआई के नकली संस्करण को रखने के लिए हेडलेस बैकएंड के लिए यह समझ में नहीं आता? – 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

संबंधित मुद्दे