2016-05-21 5 views
6

मेरे कोड के रूप में नीचे का उपयोग कर Kotlin समारोह पर, https://stackoverflow.com/a/30308199/3286489पैरामीटर में गैर-शून्य के रूप में निर्दिष्ट अशक्त जब Mokito anyObject()

import org.mockito.Mock 
import org.mockito.Mockito 
import org.mockito.MockitoAnnotations 
import org.mockito.Mockito.* 

class SimpleClassTest { 

    private fun <T> anyObject(): T { 
     Mockito.anyObject<T>() 
     return uninitialized() 
    } 

    private fun <T> uninitialized(): T = null as T 
    lateinit var simpleObject: SimpleClass 
    @Mock lateinit var injectedObject: InjectedClass 


    @Before 
    fun setUp() { 
     MockitoAnnotations.initMocks(this) 
    } 

    @Test 
    fun testSimpleFunction() { 
     simpleObject = SimpleClass(injectedObject) 

     verify(injectedObject).settingDependentObject(anyObject()) 

    } 
} 

में समाधान की बात कर रहा है मैं अभी भी नीचे त्रुटि है

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method my.package.InjectedClass.settingDependentObject, parameter dependentObject 

क्या मुझे कुछ याद आया?

UPDATED नीचे कोड का परीक्षण किया (सरलतम रूप और काम) डिफ़ॉल्ट Kotlin classes and members are final तक

class SimpleClass(val injectedClass: InjectedClass) { 

    fun simpleFunction() { 
     injectedClass.settingDependentObject(DependentClass(Response.Builder().build())) 
    } 
} 

open class DependentClass(response: Response) { 

} 

open class InjectedClass() { 
    lateinit var dependentObject: DependentClass 

    fun settingDependentObject(dependentObject: DependentClass) { 
     this.dependentObject = dependentObject 
    } 
} 

उत्तर

9

है। मॉकिटो cannot mock final classes or methods। इस प्रकार आप जब लिखें:

verify(injectedObject).settingDependentObject(anyObject()) 

वास्तविक कार्यान्वयन जो गैर शून्य तर्क की आवश्यकता है कहा जाता है।

, कि या तो अपने वर्ग और विधि खोलने के लिए या और भी बेहतर ठीक SimpleClass बदलने इसके निर्माता तर्क के रूप में एक अंतरफलक स्वीकार करते हैं और इंटरफ़ेस नकली बजाय करने के लिए।

+0

मेरा इंजेक्शनऑब्जेक्ट क्लास पहले से ही एक खुली कक्षा है। सेटिंग पर निर्भर ऑब्जेक्ट को एक गैर-शून्य वस्तु की आवश्यकता होती है, लेकिन कोई ऑब्जेक्ट() शून्य देता है। यही कारण है कि मैंने सोचा कि http://stackoverflow.com/a/30308199/3286489 में समाधान मुझे शून्य आवश्यक समस्या को दूर करने में मदद करेगा। लेकिन यह अभी भी काम नहीं कर रहा है। – Elye

+0

@Elye कृपया प्रश्न – miensol

+0

पर 'इंजेक्शन क्लास' स्रोत जोड़ें ऊपर दिए गए अद्यतन पर परीक्षण करने के लिए कक्षा को जोड़ा गया। धन्यवाद! – Elye

1

एक परियोजना विशेष रूप से मदद करने के लिए Kotlin से निपटने के "डिफ़ॉल्ट रूप से बंद कर दिया" Mockito साथ इकाई परीक्षण में नहीं है। जूनिट के लिए, आप kotlin-testrunner का उपयोग कर सकते हैं जो किसी भी कोटलिन परीक्षण को क्लासलोडर द्वारा लोड किए जाने के रूप में स्वचालित रूप से परीक्षण के लिए कक्षाएं खोलने का एक आसान तरीका है। प्रयोग सरल है, बस @RunWith(KotlinTestRunner::class) में से एक टिप्पणी जोड़ने, उदाहरण के लिए:

@RunWith(KotlinTestRunner::class) 
class MyKotlinTestclass { 
    @Test 
    fun test() { 
    ... 
    } 
} 

यह अच्छी तरह से लेख Never say final: mocking Kotlin classes in unit tests

यह सभी वर्गों होना करने की अनुमति देकर एक स्वचालित तरीके से अपने उपयोग के मामले को शामिल किया गया में शामिल है मजाक किया कि अन्यथा अनुमति नहीं दी जाएगी।

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