जब मैं मॉकिटो टेस्ट चलाता हूं तो WrongTypeOfReturnValue अपवाद होता है


96

त्रुटि विवरण:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
Boolean cannot be returned by updateItemAttributesByJuId()
updateItemAttributesByJuId() should return ResultRich
This exception might occur in wrongly written multi-threaded tests.
Please refer to Mockito FAQ on limitations of concurrency testing.

मेरा कोड:

@InjectMocks
protected ItemArrangeManager arrangeManagerSpy = spy(new ItemArrangeManagerImpl());
@Mock
protected JuItemWriteService juItemWriteService;

when(arrangeManagerSpy
    .updateItemAttributes(mapCaptor.capture(), eq(juId), eq(itemTO.getSellerId())))
    .thenReturn(false);

आप देख सकते हैं, मैं बोल रहा हूँ whenपर updateItemAttributes(जो बदले एक करता है booleanपर नहीं) updateItemAttributesByJuId

  1. क्यों Mockito एक वापस जाने के लिए प्रयास कर रहा है booleanसे updateItemAttributesByJuId?
  2. इसे कैसे ठीक किया जा सकता है?

जवाबों:


198

Https://groups.google.com/forum/?fromgroups# .topic/mockito/9WUvkhZUy90 के अनुसार , आपको अपना rephrase करना चाहिए

when(bar.getFoo()).thenReturn(fooBar)

सेवा

doReturn(fooBar).when(bar).getFoo()

3
यह शानदार टिप है। जब मैं @Aspect के@Repository साथ कुछ स्प्रिंग डीएओ पद्धति का परीक्षण कर रहा था तो मुझे भी यह समस्या आ रही थी । यदि मैं करता हूं, तो मुझे यह गलत टाइपऑफ़ऑर्नेटवर्लव्यू अपवाद मिला। थ्रू डीबग, मैं देख सकता हूं कि विधि को वास्तव में उपरोक्त कथन में कहा गया है और लगभग सलाह देता है और वापस लौटता है लेकिन मॉकिटो एक उम्मीद कर रहा है । when(someDao.someMethod()).thenReturn(List<xxx>)someMethodnullList<xxx>
LeOn - हान ली

मेरे लिए काम किया। Obrigado!
सैक्सोफोनिस्ट

बहुत बढ़िया जवाब। यह मेरा दिन बचा है।
user3198259

मेरे लिए भी काम किया! धन्यवाद! हालाँकि, मुझे दिए गए लिंक में स्पष्टीकरण पूरी तरह से समझ में नहीं आया।
जिओर्जेलियटोस

40

इसी तरह के त्रुटि संदेश के लिए एक और कारण एक finalविधि का मजाक उड़ाने की कोशिश है । अंतिम तरीकों का मजाक उड़ाने का प्रयास नहीं करना चाहिए ( अंतिम विधि का मजाक देखें )।

मैंने एक बहु-थ्रेडेड परीक्षण में त्रुटि का सामना किया है। उत्तर द्वारा gna ने उस मामले में काम किया।


20

बहुत दिलचस्पी की समस्या है। मेरे मामले में यह समस्या तब हुई जब मैंने इस तरह की रेखा पर अपने परीक्षणों को डिबग करने की कोशिश की:

Boolean fooBar;
when(bar.getFoo()).thenReturn(fooBar);

महत्वपूर्ण नोट यह है कि परीक्षण सही तरीके से डिबगिंग के बिना चल रहे थे।

किसी भी तरह से, जब मैंने उपरोक्त कोड को नीचे दिए गए कोड स्निपेट के साथ बदल दिया, तब मैं समस्या के बिना समस्या लाइन को डीबग करने में सक्षम था।

doReturn(fooBar).when(bar).getFoo();

धन्यवाद, ऐसा लगता है कि फ़ील्ड के रूप में कोटलिन डेटा वर्गों के साथ एक ही मुद्दा है, और आपके समाधान ने इसे हल किया!
मोहसिन मिरहोसिनी 17

6

मेरे लिए इसका मतलब है कि मैं इसे चला रहा था:

a = Mockito.mock(SomeClass.class);
b = new RealClass();
when(b.method1(a)).thenReturn(c); 
// within this method1, it calls param1.method2() -- note, b is not a spy or mock

तो क्या हो रहा था है कि mockito का पता लगाने गया था कि a.method2()कहा जा रहा था, और मुझे बता मैं वापस नहीं कर सकता cसे a.method2()जो गलत है।

फिक्स: doReturn(c).when(b).method1(a)स्टाइल सिंटैक्स (इसके बजाय when(b.method1(a)).thenReturn(c);) का उपयोग करें , जो आपको छिपे हुए बग को और अधिक और तेज़ी से खोजने में मदद करेगा।

या इस विशेष मामले में, यह करने के बाद कि यह अधिक सटीक "नॉटमॉक एक्ससेप्शन" दिखाना शुरू कर दिया है, और मैंने इसे बदलकर अब गैर-मॉक ऑब्जेक्ट से वापसी मान सेट करने का प्रयास नहीं किया है।


1
वही गलती मैंने भी की। मैंने पद्धति 1 में प्रयुक्त विधि का मजाक उड़ाया, निष्पादित किया और यह अपवाद मिला। एक बार जब मैंने उस कोड को हटा दिया तो यह हल हो गया।
प्रवीण। Pra३

5

मेरा हाल ही में यह मुद्दा था। समस्या यह थी कि जिस विधि का मैं मखौल उड़ाने की कोशिश कर रहा था, उसमें कोई पहुँच संशोधक नहीं था। जनता को जोड़ने से समस्या हल हो गई।


5

मुझे यह त्रुटि हुई क्योंकि मेरे परीक्षण में मुझे दो उम्मीदें थीं, एक नकली पर और एक ठोस प्रकार पर

MyClass cls = new MyClass();
MyClass cls2 = Mockito.mock(Myclass.class);
when(foo.bar(cls)).thenReturn(); // cls is not actually a mock
when(foo.baz(cls2)).thenReturn();

मैंने इसे बदलकर cls के साथ-साथ एक मजाक बनाया


4

मेरे मामले में एक स्थिर पद्धति का मजाक उड़ाने और mockStaticवर्ग पर कॉल करने की भूल करने के कारण समस्या हुई । इसके अलावा मैं कक्षा को शामिल करना भूल गया@PrepareForTest()


2

यदि आप एनोटेशन का उपयोग कर रहे हैं, तो आपको @InjectMocks के बजाय @Mock का उपयोग करने की आवश्यकता हो सकती है। क्योंकि @InjectMocks एक साथ @Spy और @Mock के रूप में काम करता है। और @Spy हाल ही में निष्पादित तरीकों का ट्रैक रखता है और आप महसूस कर सकते हैं कि गलत डेटा वापस आ गया है / डूब गया है।


2
"के @InjectMocksरूप में @Spyऔर @Mockएक साथ काम करता है ।" <- जो मुझे गलत लगता है। आपने यह कहां से सुना?
बजे एटिएन मायर्ट

2

मेरे मामले में, मैं दोनों का उपयोग कर रहा था @RunWith(MockitoJUnitRunner.class)और MockitoAnnotations.initMocks(this)। जब मैंने हटाया तो MockitoAnnotations.initMocks(this)यह सही ढंग से काम किया।


1

त्रुटि:

org.mockito.exception.misusing.WrongTypeOfReturnValue:
स्ट्रिंग को आकार ()
आकार () के साथ वापस नहीं लौटाया जा सकता है int
***
यदि आप अनिश्चित हैं कि आप उपरोक्त त्रुटि क्यों पढ़ रहे हैं।
सिंटैक्स की प्रकृति के कारण उपरोक्त समस्या हो सकती है क्योंकि:
1. यह अपवाद गलत लिखित बहु-थ्रेडेड परीक्षणों में हो सकता है

कृपया संगामिति परीक्षण की सीमाओं पर मॉकिटो FAQ देखें।
2. जब (spy.foo ()) तब () सिंटैक्स का उपयोग करके एक जासूस को ठोकर मार दी जाती है। यह
जासूसी करने के लिए सुरक्षित है -
- doReturn के साथ | फेंक () विधियों का परिवार।
Mockito.spy () विधि के लिए javadocs में अधिक ।

वास्तविक कोड:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ Object.class, ByteString.class})

@Mock
private ByteString mockByteString;

String testData = “dsfgdshf”;
PowerMockito.when(mockByteString.toStringUtf8()).thenReturn(testData); 
// throws above given exception

इस समस्या को हल करने के लिए समाधान:

1 एनोटेशन "@Mock" निकालें।

private ByteString mockByteString;

दूसरा जोड़ें PowerMockito.mock

mockByteString = PowerMockito.mock(ByteString.class);

1

मुझे हाल ही में एक कोटलिन डेटा वर्ग में एक फ़ंक्शन का मजाक उड़ाते हुए इस मुद्दे का सामना करना पड़ा । किसी अज्ञात कारण से मेरा एक टेस्ट रन एक जमे हुए राज्य में समाप्त हो गया। जब मैंने दोबारा परीक्षण किए तो मेरे कुछ परीक्षण जो पहले पारित हो गए थे, WrongTypeOfReturnValueअपवाद के साथ विफल होने लगे ।

मैंने सुनिश्चित किया कि मैं org.mockito:mockito-inlineअंतिम कक्षाओं (अरविदा द्वारा उल्लिखित) के साथ मुद्दों से बचने के लिए उपयोग कर रहा था , लेकिन समस्या बनी रही। इस प्रक्रिया को मारना और एंड्रॉइड स्टूडियो को पुनरारंभ करना मेरे लिए क्या हल था । इसने मेरे जमे हुए टेस्ट रन को समाप्त कर दिया और निम्नलिखित टेस्ट रन बिना मुद्दों के पास हो गए।



1

मैं इस मुद्दे को मिल गया WrongTypeOfReturnValueक्योंकि मैं एक लौटने के लिए एक विधि मज़ाक उड़ाया java.util.Optional;एक साथcom.google.common.base.Optional; मेरी फ़ॉर्मेटर के कारण स्वचालित रूप से लापता आयात जोड़ने।

मॉकिटो मुझे सिर्फ यह कह रहा था कि "विधि कुछ () वैकल्पिक लौटना चाहिए ..."


1

मेरे मामले में बीन को इसके बजाय @Autowired एनोटेशन का उपयोग करके आरंभीकृत किया गया है @MockBean

तो इस तरह डीएओ और सेवाओं का मजाक उड़ाना इस तरह के अपवाद को कम करता है


1
हां, मेरे मामले में स्प्रिंग-बूट एप्लिकेशन सर्विस टेस्ट, मॉकबीन का इस्तेमाल बीन की नकल करते समय किया जाना चाहिए। धन्यवाद!
इसहाक फिलिप 10

1

मेरे लिए यह मुद्दा बहुविकल्पीय परीक्षण थे जो एक साझा मोक्स पर स्टबिंग / सत्यापन कर रहे थे। यह बेतरतीब ढंग से WrongTypeOfReturnValueअपवाद को फेंकने के लिए नेतृत्व किया ।

यह मॉकिटो का उपयोग करके ठीक से लिखित परीक्षा नहीं है। मोक्स को कई थ्रेड्स से एक्सेस नहीं किया जाना चाहिए।

इसका उपाय यह था कि प्रत्येक परीक्षण के लिए मॉक को स्थानीय बनाया जाए।


1

TL, DR यदि आपके परीक्षण में कुछ तर्क हैं null, तो isNull()इसके बजाय पैरामीटर कॉल के साथ मजाक करना सुनिश्चित करें anyXXX()


स्प्रिंग बूट 1.5.x से 2.1.x पर अपग्रेड करते समय मुझे यह त्रुटि मिली। अपने स्वयं के मॉकिटो के साथ स्प्रिंग बूट जहाज, जो अब 2.x में अपग्रेड किया गया है (उदाहरण के लिए स्प्रिंग बूट की निर्भरता 2.1.2 देखें )

Mockito के लिए व्यवहार बदल गया है anyXXX()विधि है, जहां XXXहै String, Longआदि यहाँ, की जावाडोक है anyLong():

मॉकिटो 2.1.0 के बाद से, केवल मूल्यवान की अनुमति देता है Long, इस प्रकार nullअब एक वैध मूल्य नहीं है जैसा कि आदिम आवरणों के लिए अशक्त हैं, सुझाए गए एपीआई टू मैच null रैपर होंगे #isNull()। हमने महसूस किया कि यह परिवर्तन परीक्षण को बहुत सुरक्षित बना देगा कि यह मॉकिटो 1.x के साथ था।

मैं आपको उस बिंदु पर डिबग करने का सुझाव दूंगा जहां आपका मॉक कहा जाने वाला है और निरीक्षण करना है, चाहे कम से कम एक तर्क हो null। उस मामले में, यह सुनिश्चित करें कि आप अपने नकली isNull()उदाहरण के बजाय के साथ तैयार करते हैं anyLong()

तो यह:

when(MockedClass.method(anyString());

हो जाता है:

when(MockedClass.method(isNull());

-1

यह मेरा मामला है:

//given
ObjectA a = new ObjectA();
ObjectB b = mock(ObjectB.class);
when(b.call()).thenReturn(a);

Target target = spy(new Target());
doReturn(b).when(target).method1();

//when
String result = target.method2();

तब मुझे यह त्रुटि मिलती है:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
ObjectB$$EnhancerByMockitoWithCGLIB$$2eaf7d1d cannot be returned by method2()
method2() should return String

क्या आप अनुमान लगा सक्ते हो?

समस्या यह है कि Target.method1 () एक स्थिर विधि है। मॉकिटो मुझे पूरी तरह से एक और बात के लिए चेतावनी देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.