2015-09-03 7 views
20

मैं gradle testFlavorTypeमेरा JSONObject संबंधित यूनिट परीक्षण क्यों विफल रहा है?

JSONObject jsonObject1 = new JSONObject(); 
JSONObject jsonObject2 = new JSONObject(); 
jsonObject1.put("test", "test"); 
jsonObject2.put("test", "test"); 
assertEquals(jsonObject1.get("test"), jsonObject2.get("test")); 

ऊपर परीक्षण सफल होता है का उपयोग कर मेरे परीक्षण चल रहा हूँ।

jsonObject = new SlackMessageRequest(channel, message).buildBody(); 
String channelAssertion = jsonObject.getString(SlackMessageRequest.JSON_KEY_CHANNEL); 
String messageAssertion = jsonObject.getString(SlackMessageRequest.JSON_KEY_TEXT); 
assertEquals(channel, channelAssertion); 
assertEquals(message, messageAssertion); 

लेकिन उपर्युक्त दो अनुरोध विफल हो गए। स्टैक ट्रेस का कहना है कि चैनल एस्सेशन और संदेश एस्सारशन शून्य हैं, लेकिन यह सुनिश्चित नहीं है कि क्यों। मेरा सवाल है: उपर्युक्त दो आवेषण क्यों विफल रहे हैं?

नीचे SlackMessageRequest है।

junit.framework.ComparisonFailure: expected:<@tk> but was:<null> 
    at junit.framework.Assert.assertEquals(Assert.java:100) 
    at junit.framework.Assert.assertEquals(Assert.java:107) 
    at junit.framework.TestCase.assertEquals(TestCase.java:269) 
    at com.example.app.http.request.SlackMessageRequestTest.testBuildBody(SlackMessageRequestTest.java:30) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at junit.framework.TestCase.runTest(TestCase.java:176) 
    at junit.framework.TestCase.runBare(TestCase.java:141) 
    at junit.framework.TestResult$1.protect(TestResult.java:122) 
    at junit.framework.TestResult.runProtected(TestResult.java:142) 
    at junit.framework.TestResult.run(TestResult.java:125) 
    at junit.framework.TestCase.run(TestCase.java:129) 
    at junit.framework.TestSuite.runTest(TestSuite.java:252) 
    at junit.framework.TestSuite.run(TestSuite.java:247) 
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:86) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:86) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:49) 
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:64) 
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:50) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
    at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32) 
    at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93) 
    at com.sun.proxy.$Proxy2.processTestClass(Unknown Source) 
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:106) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
    at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:360) 
    at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

संपादित 5:55 PM EST

मैं समझ गए होंगे कि मैं System.out.println("") साथ प्रवेश करें और फिर परिणाम देखने चलाकर कर सकते हैं:

public class SlackMessageRequest 
     extends BaseRequest { 
    // region Variables 

    public static final String JSON_KEY_TEXT = "text"; 
    public static final String JSON_KEY_CHANNEL = "channel"; 

    private String mChannel; 
    private String mMessage; 

    // endregion 

    // region Constructors 

    public SlackMessageRequest(String channel, String message) { 
     mChannel = channel; 
     mMessage = message; 
    } 

    // endregion 

    // region Methods 

    @Override 
    public MethodType getMethodType() { 
     return MethodType.POST; 
    }  

    @Override 
    public JSONObject buildBody() throws JSONException { 
     JSONObject body = new JSONObject(); 
     body.put(JSON_KEY_TEXT, getMessage()); 
     body.put(JSON_KEY_CHANNEL, getChannel()); 
     return body; 
    } 

    @Override 
    public String getUrl() { 
     return "http://localhost:1337"; 
    } 

    public String getMessage() { 
     return mMessage; 
    } 

    public String getChannel() { 
     return mChannel; 
    } 

// endregion 
} 

नीचे स्टैकट्रेस है gradle testFlavorType --debug और परीक्षण और त्रुटि से मैंने निम्नलिखित अजीब स्थिति की खोज की है:

@Override 
public JSONObject buildBody() throws JSONException { 
    System.out.println("buildBody mChannel = " + mChannel); 
    System.out.println("buildBody mMessage = " + mMessage); 
    JSONObject body = new JSONObject(); 
    body.put(JSON_KEY_TEXT, getMessage()); 
    body.put(JSON_KEY_CHANNEL, getChannel()); 

    if (body.length() != 0) { 
     Iterator<String> keys = body.keys(); 

     if (keys.hasNext()) { 
      do { 
       String key = keys.next(); 
       System.out.println("keys: " + key); 
      } while (keys.hasNext()); 
     } 
    } else { 
     System.out.println("There are no keys????"); 
    } 

    return body; 
} 

किसी कारण से, "कोई चाबियाँ नहीं हैं ????" प्रिंट कर रहा है?!?!?!? क्यूं कर?!

संपादित 6:20 PM EST

मैं समझ गए होंगे कि कैसे इकाई परीक्षण डिबग करने के लिए। डीबगर के अनुसार, निर्दिष्ट JSONObject "null" लौटा रहा है। मेरे पास इसका कोई मतलब नहीं है (नीचे देखें)। के बाद से मुझे लगता है कि यह प्रासंगिक है, मेरी Gradle फ़ाइल निम्नलिखित शामिल हैं:

testOptions { 
    unitTests.returnDefaultValues = true 
} 

यह विशेष रूप से अजीब है क्योंकि अगर मैं परीक्षण के अंदर एक JSONObject का निर्माण, तो सब कुछ ठीक काम करता है। लेकिन अगर यह मूल एप्लिकेशन के कोड का हिस्सा है, तो यह काम नहीं करता है और उपर्युक्त करता है।

enter image description here

+0

कृपया स्टैक ट्रेस जोड़ें। –

+0

@ ज़ोलटन, मैंने स्टैक ट्रेस जोड़ा है। – tambykojak

+0

जो काम करता था, लेकिन ऐसा लगता है कि इसे अब उपकरण आर्टिफैक्ट के तहत चलाया जाना है। – mbmc

उत्तर

28

कक्षा JSONObject एंड्रॉइड एसडीके का हिस्सा है। इसका मतलब है कि डिफ़ॉल्ट रूप से यूनिट परीक्षण के लिए उपलब्ध नहीं है।

http://tools.android.com/tech-docs/unit-testing-support

कि इकाई परीक्षण चलाने के लिए किसी भी वास्तविक कोड नहीं है प्रयोग किया जाता है android.jar फ़ाइल से - कि असली उपकरणों पर एंड्रॉयड सिस्टम छवि द्वारा प्रदान की जाती है।इसके बजाए, सभी विधियां अपवाद फेंकती हैं (डिफ़ॉल्ट रूप से)। यह सुनिश्चित करने के लिए है कि आपका यूनिट परीक्षण केवल आपके कोड का परीक्षण करता है और पर एंड्रॉइड प्लेटफार्म के किसी भी विशेष व्यवहार पर निर्भर नहीं है (कि आपके पास स्पष्ट रूप से मॉकिटो का उपयोग करके मजाक नहीं किया गया है)।

आप

testOptions { 
    unitTests.returnDefaultValues = true 
} 

को परीक्षण विकल्प सेट जब आप तय कर रहे हैं "विधि ... मज़ाक उड़ाया नहीं है।" समस्या है, लेकिन परिणाम यह है कि जब आपका कोड new JSONObject() का उपयोग करता है तो आप वास्तविक विधि का उपयोग नहीं कर रहे हैं, तो आप एक नकली विधि का उपयोग कर रहे हैं जो कुछ भी नहीं करता है, यह केवल एक डिफ़ॉल्ट मान देता है। यही कारण है कि ऑब्जेक्ट null है।

आप इस प्रश्न में समस्या को हल करने के विभिन्न तरीकों पा सकते हैं: Android methods are not mocked when using Mockito

0

ठीक है, मेरी पहली कूबड़ होगा कि आपके getMessage() विधि रिटर्न null। आप अपने प्रश्न में उस विधि का शरीर दिखा सकते हैं और हमें आपके लिए जवाब मिल सकता है, लेकिन आपको शायद ब्रेकपॉइंट्स का उपयोग करके एंड्रॉइड एप्लिकेशन को डीबग करने का तरीका पता होना चाहिए।
इस तरह आप चरणबद्ध रूप से अपना कोड चरण चला सकते हैं और प्रत्येक चरण के प्रत्येक चर के मान देख सकते हैं। इससे आपको कोई समस्या नहीं दिखाई देगी, और यह एक कौशल है जिसे आप यथासंभव जल्द से जल्द मास्टर करना चाहते हैं यदि आप प्रोग्रामिंग में गंभीरता से शामिल होना चाहते हैं।

+0

उत्तर और सुझाव के लिए धन्यवाद। मैंने पहले से ही 'getMessage()' विधि का शरीर प्रदान कर लिया है। यह 'SlackMessageRequest' का हिस्सा है, क्या आपने इसे देखा था? मैं नहीं देखता कि यह कैसे शून्य हो सकता है। मैं डिबगिंग से काफी परिचित हूं, लेकिन मैं इन परीक्षणों को टर्मिनल में चला रहा हूं इसलिए मुझे पता नहीं चला कि मैं उन्हें डीबग कर सकता हूं। मैं इसे कैसे प्राप्त कर सकता हूं इस पर कोई सुझाव? – tambykojak

+0

@tambykojak शायद यह https://www.bignerdranch.com/blog/triumph-android-studio-1-2-sneaks-in-full-testing-support/ मेरी अगली हंच 'संदेश' और' कन्स्ट्रक्टर में पारित होने पर 'चैनल'' शून्य 'होते हैं। आपने कोड का हिस्सा नहीं दिखाया जहां आप उन चर को प्रारंभ करते हैं। यदि डिबगिंग वातावरण स्थापित करना बहुत जटिल है, तो आप हमेशा कुछ पंक्तियों के बीच अस्थायी लॉगिंग जोड़ सकते हैं। –

+0

मैंने उस ब्लॉग को कई बार पढ़ा है, लेकिन यह उस समस्या को हल नहीं करता है। यहां तक ​​कि यदि 'चैनल' और' टेस्ट' 'शून्य' हैं, तो परीक्षण अभी भी प्रदान किए गए तर्क के आधार पर पास होना चाहिए। – tambykojak

19

लुकास कहते हैं, JSON, Android SDK के साथ बंडल किया जाता है ताकि आप एक ठूंठ के साथ काम कर रहे हैं।

dependencies { 
    ... 
    testCompile 'org.json:json:20160810' 
} 

वैकल्पिक रूप से, आप डाउनलोड कर सकते हैं और जार में शामिल हैं::

dependencies { 
    ... 
    testCompile files('libs/json.jar') 
} 

यह not known जो Maven विरूपण साक्ष्य का संस्करण है

वर्तमान समाधान इस तरह Maven सेंट्रल से JSON खींचने के लिए है एंड्रॉइड के साथ जहाजों के बिल्कुल सटीक/सबसे करीब से मेल खाता है।

ध्यान दें कि आपको काम करने के लिए एंड्रॉइड स्टूडियो 1.1 या उच्चतर का उपयोग करने की आवश्यकता है और कम से कम टूल संस्करण 22.0.0 या इससे ऊपर का निर्माण करना है।

संबंधित समस्या: #179461

+0

यह अब मेरे लिए काम नहीं करता है। यह एक पुरानी परियोजना पर किया गया था, लेकिन अब मैं एक नया 'JSONObject' बनाने की कोशिश करते समय अभी भी' शून्य 'प्राप्त कर रहा हूं। मैं 'testCompile 'org.json का उपयोग कर रहा हूं: जेसन: 20160810''। मैंने 'configurations.all {resolutionStrategy.force 'org.json: json: 20160810'} 'की कोशिश भी की, लेकिन कोई भाग्य नहीं। कोई विचार? – AutonomousApps

+0

मैंने इसे अपने ग्रेडल आउटपुट में अभी पाया: 'चेतावनी: निर्भरता org.json: json: 20160810 को स्वाद के लिए अनदेखा किया जाता है क्योंकि यह एंड्रॉइड द्वारा प्रदान किए गए आंतरिक संस्करण के साथ विरोधाभासी हो सकता है। समस्या के मामले में, कृपया वर्ग पैकेज ' – AutonomousApps

+0

को बदलने के लिए जर्जर के साथ पुन: पैकेज करें। धन्यवाद। आपको पता नहीं है कि यह समाधान मेरे रक्तचाप में कितना मदद करता है। – jwehrle

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