প্রথম কল ব্যর্থ সিমুলেট, দ্বিতীয় কল সফল


119

আমি নীচে (সরলীকৃত) কোডটি পরীক্ষা করতে মকিতোটি ব্যবহার করতে চাই। আমি জানি না যে কীভাবে মকিতোকে প্রথমবার ব্যর্থ হতে হবে, তারপরে দ্বিতীয়বার সফল হন।

for(int i = 1; i < 3; i++) {
  String ret = myMock.doTheCall();

  if("Success".equals(ret)) {
    log.write("success");
  } else if ( i < 3 ) {
    log.write("failed, but I'll try again. attempt: " + i);
  } else {
    throw new FailedThreeTimesException();
  }
}

আমি এর সাথে সাফল্য পরীক্ষা সেটআপ করতে পারি:

Mockito.when(myMock).doTheCall().thenReturn("Success");

এবং এর সাথে ব্যর্থতা পরীক্ষা:

Mockito.when(myMock).doTheCall().thenReturn("you failed");

তবে আমি কীভাবে পরীক্ষা করতে পারি যে এটি যদি একবার (বা দুবার) ব্যর্থ হয় তবে সফল হয়, ঠিক আছে?

উত্তর:


250

ডক্স থেকে :

কখনও কখনও আমাদের একই পদ্ধতি কলের জন্য বিভিন্ন রিটার্ন মান / ব্যতিক্রম সহ স্ট্যাব করতে হয়। সাধারণ ব্যবহারের ক্ষেত্রে পুনরাবৃত্তিকারীদের উপহাস করা যায়। মকিতোর মূল সংস্করণটিতে সাধারণ উপহাসের প্রচার করার জন্য এই বৈশিষ্ট্যটি নেই। উদাহরণস্বরূপ, পুনরাবৃত্তির পরিবর্তে কেউ আইট্রেবল বা কেবল সংগ্রহগুলি ব্যবহার করতে পারেন। এগুলি স্টাবের প্রাকৃতিক উপায়ে অফার করে (যেমন আসল সংগ্রহগুলি ব্যবহার করে)। বিরল পরিস্থিতিতে দৃ consec়রূপে একটানা কলগুলি কার্যকর হতে পারে, যদিও:

when(mock.someMethod("some arg"))
   .thenThrow(new RuntimeException())
  .thenReturn("foo");

//First call: throws runtime exception:
mock.someMethod("some arg");

//Second call: prints "foo"
System.out.println(mock.someMethod("some arg"));

সুতরাং আপনার ক্ষেত্রে, আপনি চান:

when(myMock.doTheCall())
   .thenReturn("You failed")
   .thenReturn("Success");

25
এটি আমার দৃশ্যের জন্য সঠিক দিকে (ধন্যবাদ) আমাকে ইঙ্গিত করেছে যা doThrow(new RuntimeException()).doNothing().when(myMock).doTheCall();
শূন্য

38

আপনি যা চান তা লেখার সংক্ষিপ্ততম উপায়

when(myMock.doTheCall()).thenReturn("Success", "you failed");

আপনি এটি thenReturnপছন্দ করতে একাধিক যুক্তি সরবরাহ করার সময় , প্রতিটি যুক্তি একবারে একবারে ব্যবহৃত হবে, সর্বশেষ যুক্তি ব্যতীত, যা প্রয়োজন হিসাবে বহুবার ব্যবহৃত হয়। উদাহরণস্বরূপ, এই ক্ষেত্রে, আপনি 4 বার কল করলে আপনি "সাফল্য", "আপনি ব্যর্থ", "আপনি ব্যর্থ", "আপনি ব্যর্থ" পাবেন।


22

যেহেতু এর সাথে সম্পর্কিত মন্তব্যটি পড়া শক্ত, তাই আমি একটি বিন্যাসিত উত্তর যুক্ত করব।

আপনি যদি এমন কোনও voidফাংশন দিয়ে চেষ্টা করছেন যা কেবল একটি ব্যতিক্রম ছুঁড়ে দেয়, তারপরে কোনও আচরণের পদক্ষেপ না নেয়, তবে আপনি এটির মতো কিছু করবেন:

Mockito.doThrow(new Exception("MESSAGE"))
            .doNothing()
            .when(mockService).method(eq());

4

উপর যোগ করতে এই এবং এই উত্তর, এছাড়াও আপনি একটি লুপ চেইন ব্যঙ্গ কল ব্যবহার করতে পারেন। আপনার যদি একই জিনিসটি বেশ কয়েকবার উপহাস করার প্রয়োজন হয় বা কিছু প্যাটার্নে উপহাস করতে হয় তবে এটি কার্যকর।

উদাহরণস্বরূপ (বহুদূরে এক হলেও):

import org.mockito.stubbing.Stubber;

Stubber stubber = doThrow(new Exception("Exception!"));
for (int i=0; i<10; i++) {
    if (i%2 == 0) {
        stubber.doNothing();
    } else {
        stubber.doThrow(new Exception("Exception"));
    }
}
stubber.when(myMockObject).someMethod(anyString());

আমি এই স্টুবার সম্পর্কে আসলে জানতাম না এবং এটি দরকারী, +1 পেয়েছি।
মিহাই মরকভ

আপনার যদি কলটি একটি অকার্যকর পদ্ধতি দরকার হয় তবে এটি সঠিক উত্তর হওয়া উচিত।
db80

4

আমার আলাদা পরিস্থিতি আছে, আমি voidপ্রথম কলটির জন্য একটি ফাংশনকে বিদ্রূপ করতে এবং দ্বিতীয় কলটিতে এটি সাধারণত চালাতে চেয়েছিলাম ।

এটি আমার পক্ষে কাজ করে:

Mockito.doThrow(new RuntimeException("random runtime exception"))
       .doCallRealMethod()
       .when(spy).someMethod(Mockito.any());
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.