আমি যখন মকিতো পরীক্ষা চালাই তখন ভুল টাইপআফ রিটারনভ্যালু ব্যতিক্রম ঘটে


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. মকিতো কেন একটি booleanথেকে ফেরত দেওয়ার চেষ্টা করছে updateItemAttributesByJuId?
  2. এটি কীভাবে সংশোধন করা যায়?

উত্তর:


199

Https://groups.google.com/forum/?fromgroups#!topic/mockito/9WUvkhZUy90 অনুসারে আপনার নিজের পুনঃব্যবস্থাপনা করা উচিত

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

প্রতি

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

4
এই দুর্দান্ত টিপ। @ স্প্যাক্টের@Repository সাথে কিছু স্প্রিং ডিএও পদ্ধতি পরীক্ষা করার সময় আমারও এই সমস্যা ছিল । যদি আমি এটি করি when(someDao.someMethod()).thenReturn(List<xxx>), আমি এই র্রংটাইপআফ রিটারনভ্যালু ব্যতিক্রমটি পেয়েছি। ডিবাগের মাধ্যমে, আমি দেখতে পাচ্ছি যে someMethodপদ্ধতিটি আসলে উপরের বিবৃতিতে ডাকা হয়েছিল এবং nullআশেপাশের পরামর্শটি ট্রিগার করে এবং একটি ফেরত দেয় তবে মকিতো একটি আশা করে List<xxx>
লিওন - হান লি

আমার জন্য কাজ করেছেন। ওব্রিগাদো!
স্যাক্সোফোনিস্ট

দুর্দান্ত উত্তর। এটা আমার দিন সংরক্ষণ করা।
ব্যবহারকারী3198259

আমার জন্যও কাজ করেছেন! ধন্যবাদ! যদিও, আমি প্রদত্ত লিঙ্কটিতে ব্যাখ্যাটি পুরোপুরি বুঝতে পারি নি।
জর্জিলেটসস

40

অনুরূপ ত্রুটি বার্তার আর একটি কারণ একটি finalপদ্ধতিকে উপহাস করার চেষ্টা করছে । চূড়ান্ত পদ্ধতিগুলি উপহাস করার চেষ্টা করা উচিত নয় ( চূড়ান্ত পদ্ধতি উপহাস করে দেখুন )।

আমি বহু-থ্রেড পরীক্ষায় ত্রুটিটিরও মুখোমুখি হয়েছি। উত্তর দ্বারা gna যে ক্ষেত্রে কাজ করেছে।


20

খুব আগ্রহী সমস্যা। আমার ক্ষেত্রে এই সমস্যাটি হয়েছিল যখন আমি এই জাতীয় লাইনে আমার পরীক্ষাগুলি ডিবাগ করার চেষ্টা করেছি:

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

গুরুত্বপূর্ণ নোটটি হ'ল পরীক্ষাগুলি ডিবাগিং ছাড়াই সঠিকভাবে চলছিল।

যে কোনও উপায়ে, যখন আমি নীচের কোড স্নিপেটের সাথে উপরের কোডটি প্রতিস্থাপন করেছি তখন আমি সমস্যা ছাড়াই সমস্যাটির লাইনটি ডিবাগ করতে সক্ষম হয়েছি।

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

ধন্যবাদ, দেখে মনে হচ্ছে কোটলিন ডেটা ক্লাসগুলি ক্ষেত্র হিসাবে একই সমস্যা রয়েছে এবং আপনার সমাধান এটি সমাধান করেছে!
মোহসেন মিরহোসিনি

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

সুতরাং যা হচ্ছিল তা হ'ল মকিতো যেটি ডেকেছিল তা সনাক্ত a.method2()করছিল এবং আমাকে বলছিল যে আমি ভুল cথেকে ফিরে আসতে পারছি না a.method2()

স্থির করুন: doReturn(c).when(b).method1(a)স্টাইল সিনট্যাক্স (পরিবর্তে when(b.method1(a)).thenReturn(c);) ব্যবহার করুন , যা আপনাকে লুকানো বাগটি আরও সংক্ষিপ্তভাবে এবং দ্রুত আবিষ্কার করতে সহায়তা করবে।

অথবা এই নির্দিষ্ট ক্ষেত্রে, এটি করার পরে এটি আরও সঠিক "নটমকএক্সসেপশন" দেখাতে শুরু করেছে এবং আমি এটিকে পরিবর্তন করে নন-মক অবজেক্ট থেকে কোনও ফেরতের মান সেট করার চেষ্টা না করে চলেছি।


4
একই ভুল আমিও করেছি। আমি পদ্ধতি 1 তে ব্যবহৃত পদ্ধতিটিকে উপহাস করেছি, মৃত্যুদন্ড কার্যকর করেছি এবং এই ব্যতিক্রম পেয়েছি। আমি যখন এই কোডটি সরিয়েছি তখন এটি সমাধান হয়ে গেছে।
প্রবীণ.883

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();

আমি ক্লসকেও এটি একটি উপহাস হিসাবে পরিবর্তন করে ঠিক করেছি


4

আমার ক্ষেত্রে সমস্যাটি একটি স্ট্যাটিক পদ্ধতিকে উপহাস করার চেষ্টা এবং mockStaticক্লাসে ডাকতে ভুলে যাওয়ার কারণে হয়েছিল। এছাড়াও আমি ক্লাসটি অন্তর্ভুক্ত করতে ভুলে গেছি@PrepareForTest()


2

আপনি যদি টীকাগুলি ব্যবহার করছেন তবে আপনার প্রয়োজন হতে পারে @ ইনজেক্টমোকসের পরিবর্তে @ মক ব্যবহার করা দরকার। কারণ @ ইনজেক্টমকস @ এসপিএস এবং @ মক হিসাবে কাজ করে। এবং @ এসপি সম্প্রতি সম্পাদিত পদ্ধতিগুলির উপর নজর রাখে এবং আপনি অনুভব করতে পারেন যে ভুল ডেটা ফিরে এসেছে / সাবড হয়েছে।


4
" @InjectMocksহিসাবে @Spyএবং @Mockএকসাথে কাজ করে।" <- এটি আমার কাছে ভুল বলে মনে হচ্ছে। আপনি কোথা থেকে শুনেছেন?
এতিয়েন মিরেট

2

আমার ক্ষেত্রে, আমি @RunWith(MockitoJUnitRunner.class)এবং উভয়ই ব্যবহার করছিলাম MockitoAnnotations.initMocks(this)। যখন আমি সরিয়েছি MockitoAnnotations.initMocks(this)এটি সঠিকভাবে কাজ করেছে।


1

ত্রুটি:

org.mockito.exception.misusing.RrongTypeOfReturnValue:
স্ট্রিং আকার দ্বারা ()
আকারে ফিরতে পারবেন না () পূর্বে ফিরে আসা উচিত
***
আপনি যদি নিশ্চিত না হন যে কেন আপনি উপরের ত্রুটিটি পড়ছেন।
সিনট্যাক্সের প্রকৃতির কারণে উপরের সমস্যাটি দেখা দিতে পারে কারণ:
১. এই ব্যতিক্রম ভুলভাবে লিখিত বহু-থ্রেডযুক্ত পরীক্ষায় হতে পারে

সম্মতিযুক্ত পরীক্ষার সীমাবদ্ধতার বিষয়ে দয়া করে মকিতো FAQ দেখুন।
২. কোনও গুপ্তচরকে (স্পাই.ফু ()) এর পরে () সিনট্যাক্স ব্যবহার করে আঘাত করা হয়। এটি
স্টাব স্পাই থেকে নিরাপদ -
- doReturn এর সাথে | পদ্ধতির পরিবারকে নিক্ষেপ করুন।
মকিতো.স্পাই () পদ্ধতির জন্য জাভাডোকগুলিতে আরও ।

আসল কোড:

@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 ম টিকা সরান "@ মোক"।

private ByteString mockByteString;

২ য় অ্যাড PowerMockito.mock

mockByteString = PowerMockito.mock(ByteString.class);

1

একটি কোটলিন ডেটা ক্লাসে কোনও ফাংশনকে উপহাস করার সময় আমি সম্প্রতি এই সমস্যার মুখোমুখি হয়েছি । কোনও অজানা কারণে আমার একটি পরীক্ষার রান হিমশীতল অবস্থায় শেষ হয়েছিল। আমি যখন আবার পরীক্ষা চালালাম তখন আমার কিছু পরীক্ষাগুলি যা ইতিপূর্বে উত্তীর্ণ হয়েছিল WrongTypeOfReturnValueব্যতিক্রম সহ ব্যর্থ হতে শুরু করে ।

আমি নিশ্চিত করেছি যে আমি org.mockito:mockito-inlineচূড়ান্ত ক্লাসগুলির সাথে সমস্যাগুলি এড়ানোর জন্য ব্যবহার করছি (অরভিদা উল্লিখিত), তবে সমস্যাটি রয়ে গেল। আমার পক্ষে কী সমাধান হয়েছিল তা হ'ল প্রক্রিয়াটি মেরে ফেলা এবং অ্যান্ড্রয়েড স্টুডিও পুনরায় চালু করা । এটি আমার হিমশীতল পরীক্ষাটি বাতিল করেছে এবং নিম্নলিখিত পরীক্ষাগুলি কোনও সমস্যা ছাড়াই পাস করেছে passed



1

আমি এই বিষয় পেয়েছিলাম WrongTypeOfReturnValueকারণ আমি একটি ফিরতি একটি পদ্ধতি ব্যঙ্গ java.util.Optional;একটি সঙ্গে com.google.common.base.Optional;আমার ফরম্যাটার কারণে স্বয়ংক্রিয়ভাবে অনুপস্থিত আমদানির যোগ।

মকিতো আমাকে কেবল বলছিলেন যে "পদ্ধতির কিছু () ptionচ্ছিক ফিরে আসা উচিত" ...


1

আমার ক্ষেত্রে শিম ব্যবহার সক্রিয়া করা হয়েছে @Autowired পরিবর্তে টীকা @MockBean

সুতরাং এইভাবে ডিএও এবং পরিষেবাদির উপহাস করা এ জাতীয় ব্যতিক্রম ছুঁড়ে দেয়


4
হ্যাঁ, আমার ক্ষেত্রে একটি স্প্রিং-বুট অ্যাপ্লিকেশন পরিষেবা পরীক্ষা, শিমের উপহাস করার সময় মকবিয়ান ব্যবহার করা উচিত। ধন্যবাদ!
আইজাক ফিলিপ

1

আমার জন্য বিষয়টি হ'ল মাল্টিথ্রেডেড টেস্টগুলি যা ভাগ করা উপহাসগুলিতে স্টাব / ভেরিফিকেশন করছিল। এটি এলোমেলোভাবে ছোঁড়া WrongTypeOfReturnValueব্যতিক্রমের দিকে পরিচালিত করে।

এটি মকিতো ব্যবহার করে সঠিকভাবে লিখিত পরীক্ষা নয়। মোকগুলি একাধিক থ্রেড থেকে অ্যাক্সেস করা উচিত নয়।

সমাধানটি ছিল প্রতিটি পরীক্ষায় মোককে স্থানীয় করে তোলা।


1

টিএল; ডিআর যদি আপনার পরীক্ষায় কিছু যুক্তি nullথাকে তবে isNull()তার পরিবর্তে প্যারামিটার কলটি উপহাস করতে ভুলবেন না anyXXX()


স্প্রিং বুট 1.5.x থেকে 2.1.x এ আপগ্রেড করার সময় আমি এই ত্রুটিটি পেয়েছি নিজস্ব মকিতো সহ স্প্রিং বুট জাহাজগুলি বর্তমানে ২.x এ উন্নীত হয়েছে (উদাহরণস্বরূপ স্প্রিং বুট ২.১.২ এর নির্ভরতাগুলি দেখুন )

Mockito জন্য আচরণ পরিবর্তন করা হয়েছে anyXXX()পদ্ধতি, যেখানে XXXহয় String, Longইত্যাদি এখানে, এর javadoc হয় anyLong():

Mockito 2.1.0 সাল থেকে, শুধুমাত্র মূল্যবান অনুমতি Long, এইভাবে nullআর না একটি বৈধ মান আদিম চাদরে nullable আছেন যে প্রস্তাব এপিআই হয় মেলে null মোড়কের হবে #isNull()। আমরা অনুভব করেছি যে এই পরিবর্তনটি পরীক্ষাগুলিকে আরও নিরাপদ করে তুলবে যা এটি মকিতো 1.x এর সাথে ছিল was

আমি আপনাকে এমন বিন্দুতে ডিবাগ করার পরামর্শ দিচ্ছি যেখানে আপনার মক ডাকতে এবং পরিদর্শন করতে চলেছে, কমপক্ষে একটি যুক্তি রয়েছে কিনা 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

আপনি অনুমান করতে পারেন?

সমস্যাটি হ'ল টার্গেট.মোথডা 1 () একটি স্থির পদ্ধতি। মকিতো আমাকে অন্য একটি বিষয়ে সম্পূর্ণ সতর্ক করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.