মকিতো কলব্যাক এবং আর্গুমেন্টের মান পাওয়া


89

ফাংশন আর্গুমেন্টের মানগুলি ক্যাপচার করার জন্য আমি মকিতো পাওয়ার কোনও ভাগ্য পাচ্ছি না! আমি একটি অনুসন্ধান ইঞ্জিন সূচককে উপহাস করছি এবং একটি সূচি তৈরির পরিবর্তে, আমি কেবল একটি হ্যাশ ব্যবহার করছি।

// Fake index for solr
Hashmap<Integer,Document> fakeIndex;

// Add a document 666 to the fakeIndex
SolrIndexReader reader = Mockito.mock(SolrIndexReader.class);

// Give the reader access to the fake index
Mockito.when(reader.document(666)).thenReturn(document(fakeIndex(666))

আমি নির্বিচারে তর্কগুলি ব্যবহার করতে পারি না কারণ আমি প্রশ্নের ফলাফলগুলি পরীক্ষা করছি (অর্থাত্ তারা যে দস্তাবেজগুলি ফিরে আসে)। তেমনি, আমি প্রতিটি দস্তাবেজের জন্য একটি নির্দিষ্ট মান নির্দিষ্ট করতে এবং চাই না!

Mockito.when(reader.document(0)).thenReturn(document(fakeIndex(0))
Mockito.when(reader.document(1)).thenReturn(document(fakeIndex(1))
....
Mockito.when(reader.document(n)).thenReturn(document(fakeIndex(n))

আমি ইউজিং মকিতো পৃষ্ঠার কলব্যাক্স বিভাগটি দেখেছি । দুর্ভাগ্যক্রমে, এটি জাভা নয় এবং জাভাতে কাজ করার জন্য আমি নিজের নিজস্ব ব্যাখ্যাটি পেতে পারি না।

সম্পাদনা (স্পষ্টকরণের জন্য): আমি কীভাবে মকিতোকে একটি যুক্তি এক্স ক্যাপচার করতে এবং এটি আমার ফাংশনে পাস করতে পারি? আমি এক্সের সঠিক মান (বা রেফ) ফাংশনে প্রেরণ করতে চাই।

আমি সমস্ত কেস গণনা করতে চাই না, এবং স্বেচ্ছাচারী যুক্তি কাজ করবে না কারণ আমি বিভিন্ন প্রশ্নের জন্য বিভিন্ন ফলাফলের জন্য পরীক্ষা করছি।

মকিতো পৃষ্ঠাটি বলেছে

val mockedList = mock[List[String]]
mockedList.get(anyInt) answers { i => "The parameter is " + i.toString } 

এটি জাভা নয়, এবং আমি জানি না কীভাবে জাভাতে অনুবাদ করা যায় বা কোনও ফাংশনে যা ঘটেছিল তা পাস করতে পারি।


আমি নিশ্চিত না যে আমি ঠিক বুঝতে পেরেছি আপনার জন্য কী ব্যর্থ হচ্ছে। আপনার কলটি আপনার জন্য Mockito.when(reader.document(666)).thenReturn(document(fakeIndex(666))মক অবজেক্টটি সেটআপ করা উচিত। ফোন করলে কি হয় reader.document(666)?
হাই

666 জরিমানা কাজ করে। তবে, আমি একটি নির্দিষ্ট নম্বর এক্স এ পাস করতে এবং ফেক ইন্ডেক্স (এক্স) এর ফলাফল পেতে সক্ষম হতে চাই। কোয়েরিগুলির পরীক্ষার জন্য আমার কাছে প্রচুর সংখ্যক সম্ভাব্য ডক্স রয়েছে এবং আমি সেগুলি সমস্ততে প্রবেশ করতে চাই না।
nflacco

উত্তর:


104

আমি কখনও মকিতো ব্যবহার করি নি, তবে শিখতে চাইছি, তাই এখানেও যায়। আমার চেয়ে কম উত্তর দিলে কেউ উত্তর দেয়, প্রথমে তাদের উত্তরটি চেষ্টা করে দেখুন!

Mockito.when(reader.document(anyInt())).thenAnswer(new Answer() {
 public Object answer(InvocationOnMock invocation) {
     Object[] args = invocation.getArguments();
     Object mock = invocation.getMock();
     return document(fakeIndex((int)(Integer)args[0]));
     }
 });

4
আমি কেবল মকিতোর ডানদিকে লিঙ্কটি লক্ষ্য করেছি : কীভাবে কোনও পদ্ধতি এটির মধ্যে দেওয়া যুক্তিটি ফিরিয়ে আনবে । দেখে মনে হচ্ছে আমি খুব কাছেই আছি
এড স্টাব

মূল প্রশ্নটির সাথে শক্তিশালী ব্যবহারকারীর খ্যাতি (6 666)! এটা খুব ভাল কাজ করেছে। স্টাফ সংকলনের জন্য আমার করা পরিবর্তনটি কেবল অবজেক্টের উত্তরের সামনে প্রকাশ করা হয়েছিল (InvocationOnMock অনুরোধ) ....
nflacco

54

ArgumentCaptors দেখুন:

https://site.mockito.org/javadoc/current/org/mockito/ArgumentCaptor.html

ArgumentCaptor<Integer> argument = ArgumentCaptor.forClass(Integer.class);
Mockito.when(reader.document(argument.capture())).thenAnswer(
  new Answer() {
    Object answer(InvocationOnMock invocation) {
      return document(argument.getValue());
    }
  });

4
বাহ, আমি জানতাম না যে আপনি ArgumentCaptorস্টাবিংয়ের জন্য ব্যবহার করতে পারেন । যদিও এই লিঙ্কটিতে এটি সম্পর্কে একটি বড় অল 'সতর্কতা রয়েছে। সাবধানতার সাথে এগিয়ে যান.
জ্ঞানহীন

4
হ্যাঁ, আপনি ঠিক বলেছেন। অপহরণকারীদের কেবল যাচাইকরণের সাথে ব্যবহার করা উচিত।
কোয়ালিডেফিয়াল

41

আপনি আর্গুমেন্টক্যাপ্টারের সাথে পরীক্ষায় কার্যকর হওয়ার আশ্বাস দিতে এবং আর্গুমেন্টক্যাপ্টারের সাথে যুক্তিগুলি মূল্যায়নের জন্য যাচাইকরণ () ব্যবহার করতে চাইতে পারেন:

ArgumentCaptor<Document> argument = ArgumentCaptor.forClass(Document.class);
verify(reader).document(argument.capture());
assertEquals(*expected value here*, argument.getValue());

আরও ম্যানিপুলেশন / চেকিং বা আপনি যা কিছু করতে চান তার জন্য আর্গুমেন্টের মানটি আর্গুমেন্টের মাধ্যমে স্পষ্টতই অ্যাক্সেসযোগ্য ue


4
সেরা উত্তর: সোজা এগিয়ে, বুঝতে সহজ
রাদু কুগুট

প্রশ্নের উত্তর দেয় না। প্রশ্ন মকিতো.ইন সম্পর্কে এবং যখন যাচাই করা হয় না।
seBaka28

@ seBaka28 আর্গুমেন্ট পাওয়ার সর্বোত্তম সমাধান হল একটি আর্গুমেন্ট বন্দী। আর্গুমেন্টক্যাপ্টরগুলিকে মকিতোর লেখকরা যাচাইয়ের সাথে দৃ strongly়ভাবে ব্যবহার করার পরামর্শ দিয়েছেন, সুতরাং আমি একটি পূর্ণ দৃষ্টিকোণ উত্তর দিতে চেয়েছিলাম। যদি আপনি নিজের জন্য এগুলি ব্যবহার না করা চয়ন করেন তবে এটি আপনার পছন্দ, তবে পরামর্শ দেওয়া হয়নি। সম্পাদনা: আমি দেখতে পাচ্ছি না কীভাবে এটি একটি ডাউনটাউকে ন্যায়সঙ্গত করে তোলে, তবে এটি আপনার পছন্দও।
fl0w

4
কারণ এটি প্রশ্নের উত্তর দেয় না। হ্যাঁ, আপনি যখন আর্গুমেন্টটি ক্যাপচার করতে চান তখন আর্গুমেন্টক্যাপ্টর দুর্দান্ত তবে আপনি কখন (...) এর সাথে একত্রে এটি ব্যবহার করতে পারবেন না then একটি নির্দিষ্ট বস্তু ফেরত দেওয়ার কথা।
seBaka28

4
@ ইউরাহয় যা আপনি যাচাইকরণ ব্যবহার করেন এবং অবজেক্ট বা পদ্ধতিটি প্রত্যাশার জন্য যাচাই করার আগে বলেছিলেন তার চেয়ে অনেক বেশি বার বলা হয় standard আপনি নিম্নলিখিত হিসাবে (এন) যুক্তি যুক্ত করে প্রত্যাশা গণনা পরিবর্তন করতে পারেন: যাচাই করুন (পাঠক, বার (5)) - এটি 5 টি ইন্টারঅ্যাকশন আশা করবে। রেফারেন্সের জন্য দয়া করে দেখুন: baeldung.com/mockito-verify
fl0w

14

জাভা 8 এর সাথে এটি এমন কিছু হতে পারে:

Mockito.when(reader.document(anyInt())).thenAnswer(
  (InvocationOnMock invocation) -> document(invocation.getArguments()[0]));

আমি ধরে নিচ্ছি যে documentএটি একটি মানচিত্র।

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