मेरे पास एक तरीका है

fun getUser(userId: UserId): Optional<User?> = userRepository.findById(userId)

जो जावा में एक वैकल्पिक देता है। इसलिए मैं अपने कोटलिन यूनिट टेस्ट में उस मेथड कॉल का मजाक उड़ाना चाहता हूं।

यह मेरा पहला अनुमान था...

given { mockedUserService.getUser(currentUser.userId) }.willReturn(Optional.of(currentUser))

... लेकिन संकलक कहता है नहीं

बेमेल टाइप करें: अनुमानित प्रकार वैकल्पिक है लेकिन वैकल्पिक है<उपयोगकर्ता?>! अपेक्षित था

इसलिए मैंने कंपाइलर को खुश करने के लिए val currentUser: User? बनाना शुरू किया।

given { currentUser?.userId?.let { mockedUserService.getUser(it) }.willReturn(Optional.of(currentUser))

बेमेल टाइप करें: अनुमानित प्रकार वैकल्पिक है लेकिन वैकल्पिक है<उपयोगकर्ता?>? अपेक्षित था

बेमेल टाइप करें: अनुमानित प्रकार उपयोगकर्ता है? लेकिन TypeVariable(T) अपेक्षित था

और अब मैं कुछ खो गया हूँ। मैं कंपाइलर को खुश कैसे कर सकता हूं?

3
xetra11 21 पद 2020, 16:52

3 जवाब

सबसे बढ़िया उत्तर

परीक्षण को ठीक करने का एक तरीका होगा, लेकिन वास्तव में यहां समस्या नहीं है। जब भी संभव हो कोटलिन में आपको Optional से बचना चाहिए। जावा के टाइप सिस्टम में शून्य और गैर-शून्य मानों को अलग करने का कोई तरीका नहीं है। कोटलिन करता है, इसलिए आपको Optional<T> को जल्द से जल्द T? में बदलना चाहिए।

आप अपने फ़ंक्शन को इस तरह आसानी से ठीक कर सकते हैं:

fun getUser(userId: UserId): User? = userRepository.findById(userId).orElse(null)
1
Willi Mentzel 21 पद 2020, 18:47

इसे एक विकल्प के रूप में मानें। मुझे लगता है कि आप जावा के प्रकार Optional का उपयोग कर रहे हैं, न कि अपने स्वयं के कार्यान्वयन का (जितना मैं यहां देख सकता हूं उससे अधिक कर रहा हूं)।

Optional एनपीई से बचने के लिए जावा में आया और रनटाइम पर एक प्रकार की अनुपस्थिति को इंगित करता है। लेकिन कोटलिन में आपको वास्तव में एक वैकल्पिक की आवश्यकता नहीं है, क्योंकि आप स्पष्ट रूप से अपने प्रकार को अशक्त T? के रूप में परिभाषित कर सकते हैं।

तो आप या तो इसे इस प्रकार परिभाषित कर सकते हैं:

fun getUser(userId: UserId): User?

या

fun getUser(userId: UserId): Optional<User> // not nullable!
3
Willi Mentzel 21 पद 2020, 18:50

आप लौटेंगे के बजाय उत्तर देंगे कोशिश कर सकते हैं:

given { mockedUserService.getUser(currentUser.userId) }.willAnswer { Optional.of(currentUser) }
2
Sebastian Heikamp 21 पद 2020, 17:30