মকিতো যাচাইয়ের আদেশ / পদ্ধতি কলগুলির ক্রম


205

মকিতোতে methodOneআগে ডাকা হয়েছে কিনা তা যাচাই করার কোনও উপায় আছে methodTwo?

public class ServiceClassA {
    public void methodOne(){}
 }

public class ServiceClassB {
    public void methodTwo(){}
 }

public class TestClass {
    public void method(){
        ServiceClassA serviceA = new ServiceClassA();
        ServiceClassB serviceB = new ServiceClassB();
        serviceA.methodOne();
        serviceB.methodTwo();
    }
}

উত্তর:


305

InOrder আপনাকে এটি করতে সহায়তা করে।

ServiceClassA firstMock = mock(ServiceClassA.class);
ServiceClassB secondMock = mock(ServiceClassB.class);

Mockito.doNothing().when(firstMock).methodOne();   
Mockito.doNothing().when(secondMock).methodTwo();  

//create inOrder object passing any mocks that need to be verified in order
InOrder inOrder = inOrder(firstMock, secondMock);

//following will make sure that firstMock was called before secondMock
inOrder.verify(firstMock).methodOne();
inOrder.verify(secondMock).methodTwo();

5
এটি সঠিক, যদিও অন্য স্টাবের জন্য স্থানধারক ব্যতীত এখানে করণীয়ের কিছুই করার দরকার নেই। মকিটো নিঃশব্দে অকার্যকর পদ্ধতি কলগুলি ডিফল্টরূপে গ্রহণ করবে।
জেফ বোম্যান

1
এটি তাদের গ্রহণ করে যখন অবজেক্টটির কোনও নির্ভরতা নেই যদি বস্তুর নির্ভরতা থাকে তবে সেখানে ব্যতিক্রম থাকবে =)
কাইটোয়ার

14
inOrder.verifyNoMoreInteractions();অন্য কোনও কল করা হয়নি তা যাচাই করতে এই উদাহরণে সর্বশেষ যাচাইয়ের পরে বিবেচনা করুন ।
ডিডব্বি

1
কেবল স্পষ্ট করে বলার জন্য: বিদ্রূপে কিছু (পরীক্ষিত) পদ্ধতি চাওয়ার পরে - যাচাইয়ের ঠিক আগে অর্ডার সংজ্ঞায়িত করা নিরাপদ।
ব্যবহারকারী 3078523

ফলাফলগুলি কি একইরকম inOrder(firstMock, secondMock)এবং inOrder(secondMock, firstMock)? সম্ভবত আপনি এই সম্পর্কে একটি নোট করতে উত্তর আপডেট করতে পারেন।
কেভিনারপে

94

নোট করুন যে আপনি কেবল দুটি বা ততোধিক মককেই নয়, একক উপহাসের জন্য বিভিন্ন পদ্ধতি আহ্বান করা হয়েছে তা যাচাই করতে আপনি ইনঅর্ডার ক্লাসটিও ব্যবহার করতে পারেন ।

ধরুন আমার দুটি ক্লাস রয়েছে Fooএবং Bar:

public class Foo {
  public void first() {}
  public void second() {}
}

public class Bar {
  public void firstThenSecond(Foo foo) {
    foo.first();
    foo.second();
  }
}

তারপরে আমি পরীক্ষার শ্রেণি যুক্ত করতে পারি যে Barএর firstThenSecond()পদ্ধতিটি আসলে কল করে first(), তারপরে second(), এবং না second()তখন first()। নিম্নলিখিত পরীক্ষার কোডটি দেখুন:

public class BarTest {
  @Test
  public void testFirstThenSecond() {
    Bar bar = new Bar();
    Foo mockFoo = Mockito.mock(Foo.class);
    bar.firstThenSecond(mockFoo);

    InOrder orderVerifier = Mockito.inOrder(mockFoo);
    // These lines will PASS
    orderVerifier.verify(mockFoo).first();
    orderVerifier.verify(mockFoo).second();

    // These lines will FAIL
    // orderVerifier.verify(mockFoo).second();
    // orderVerifier.verify(mockFoo).first();
  }
}

1
এটি সম্পূর্ণ নতুন উত্তর নয়, গৃহীত উত্তর সম্পর্কে একটি মন্তব্য হওয়া উচিত ছিল।
এইচ

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

2
একই পদ্ধতিটি যাচাই করার জন্য কি কোনও উপায় বলা হয়েছে দুবার বলা হয়েছে, কিন্তু প্যারামিটারগুলির ক্রমটি যাচাই করা হয়েছে? যেমন প্রথমে find('foo'), তারপরেfind('bar')
স্নেকস

1
ভালো দেখায় আমার উত্তর হতে পারে stackoverflow.com/questions/36573399/...
Snekse

3
এটি আসলে গৃহীত উত্তরের চেয়ে একটি ভাল উদাহরণ কারণ এটি এর চেয়ে বেশি সাধারণ ব্যবহার দেখায়doNothing()
আর্কিমিডিস ট্রাজানো

37

হ্যাঁ, এটি ডকুমেন্টেশনে বর্ণিত হয়েছে। আপনাকে ইনঅর্ডার ক্লাসটি ব্যবহার করতে হবে ।

উদাহরণ (ধরে নেওয়া হয়েছে দুটি টি ইতিমধ্যে তৈরি করেছেন):

InOrder inOrder = inOrder(serviceAMock, serviceBMock);

inOrder.verify(serviceAMock).methodOne();
inOrder.verify(serviceBMock).methodTwo();

1

বিডিডি দিয়ে এটি

@Test
public void testOrderWithBDD() {


    // Given
    ServiceClassA firstMock = mock(ServiceClassA.class);
    ServiceClassB secondMock = mock(ServiceClassB.class);

    //create inOrder object passing any mocks that need to be verified in order
    InOrder inOrder = inOrder(firstMock, secondMock);

    willDoNothing().given(firstMock).methodOne();
    willDoNothing().given(secondMock).methodTwo();

    // When
    firstMock.methodOne();
    secondMock.methodTwo();

    // Then
    then(firstMock).should(inOrder).methodOne();
    then(secondMock).should(inOrder).methodTwo();


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