2015-05-25 8 views
7

क्या विभिन्न स्रोतों में कोटलिन पैकेज फ़ंक्शंस और पैकेज गुणों का उपयोग करना संभव है? जब मैं ऐसा करने की कोशिश करता हूं, तो मेरे पास NoSuchMethodError फेंक दिया जाता है।कोटलिन: java.lang.No.SuchMethod परीक्षण में त्रुटि


उदाहरण

मैं Kotlin कोड और उस में दो sourcesets, main और test साथ Gradle परियोजना है। main में, मैं फ़ाइलों में से एक में निम्नलिखित कोड है: जहां payloadSplitter है

package ru.ifmo.ctddev.igushkin.dkvs 
... 
public class MessageTests { 
    ... 
    test fun testParsing() { 
     ... 
     checkParseAndToString("p1b 345 ${payloadSplitter} set a b c") 
    } 
    ... 
} 

और वास्तव में पहली पंक्ति में:

package ru.ifmo.ctddev.igushkin.dkvs 
... 
public val payloadSplitter: String = " ### " 

test में मैं निम्न कोड के साथ payloadSplitter तक पहुँचने का प्रयास पहुँचा, कार्यावधि में मैं

java.lang.NoSuchMethodError: ru.ifmo.ctddev.igushkin.dkvs.DkvsPackage.getPayloadSplitter()Ljava/lang/String; 

अन्य वैश्विक चर और फ़ंक्शन भी test में एक ही त्रुटि के साथ पहुंच योग्य नहीं हैं।


युपीडी Kotlin टीम मुद्दा समझाया और ठीक here की घोषणा की।

+1

आप किसी भी शीर्ष स्तर के कार्यों/ru.ifmo.ctddev.igushkin.dkvs पैकेज में टेस्ट मैचों में गुण है? –

+0

आप परीक्षण कैसे चलाते हैं? क्या आप अपनी ग्रेडल कॉन्फ़िगरेशन पोस्ट कर सकते हैं? ऐसा लगता है कि परीक्षण पैकेज मुख्य पैकेज के खिलाफ संकलित है लेकिन इसके बिना भाग गया है। –

+0

@ सलमोमनBRYS, https://github.com/h0tk3y/dkvs/blob/master/build.gradle - यहां यह है। – hotkey

उत्तर

5

कक्षाओं के बाहर गुणों और विधियों के लिए, कोटलिन ने $ {packagename} नामक जावा श्रेणी बनाई है जिसमें गुण और विधियों के रूप में लागू विधियों और विधियों के साथ पैकेज बनाया गया है। एकाधिक स्रोत-सेट के साथ, प्रत्येक वर्ग-सेट के लिए जावा क्लास दो बार बनाया जाएगा। आपकी समस्या यह है कि परीक्षण स्रोत-सेट "पैकेज क्लास" मुख्य स्रोत-सेट में संकलित कक्षा को छुपा रहा है।

जैसा कि ऊपर टिप्पणी में उल्लेख किया है, परीक्षण स्रोत निर्धारित परीक्षण उत्पादन निर्देशिका में इस पैकेज वर्ग बनाने से Kotlin संकलक को रोकने के लिए किसी भी शीर्ष स्तर के गुण या तरीकों होने से बचने के।

+0

धन्यवाद। आपने जो कहा है उससे एक और कामकाज है, मैंने इसे एक और जवाब के रूप में पोस्ट किया है। – hotkey

+0

इस समाधान के लिए एक और पक्ष नोट; कम से कम Gradle में, आपको एक साफ निर्माण चलाने की आवश्यकता है, या परीक्षण धावक अभी भी जेनरेट की गई पैकेज कक्षा को पायेगा। –

1

क्या पहले सुझाव दिया गया था के अलावा, मैं एक वैकल्पिक हल मिल गया: यदि आप test में पैकेज स्तर के कार्यों या गुण की जरूरत है सिर्फ अलग पैकेज, जैसे करने के लिए परीक्षण के लिए कदम अपने परीक्षण स्रोतों में:

package ru.ifmo.ctddev.igushkin.dkvs.tests 

और फिर

import ru.ifmo.ctddev.igushkin.dkvs.* 

जो अपने मुख्य पैकेज से सब कुछ है। इससे कोटलिन शिकायतकर्ता दो गैर-विवादित पैकेज वर्ग उत्पन्न करेगा, इसलिए दोनों के पास वैश्विक सदस्य हो सकते हैं।