মকিতোর আর্গুমেন্টের উদাহরণ ক্যাপ্টর


141

যে কেউ দয়া করে আমাকে org.mockito.ArgumentCaptorক্লাসটি কীভাবে ব্যবহার করবেন এবং কীভাবে এটি মকিতো সরবরাহ করা হয় সেই সাধারণ ম্যাচারদের থেকে আলাদা কী তা দেখানোর জন্য একটি উদাহরণ প্রদান করতে পারেন ।

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

উত্তর:


187

@Fge আরও কি বলেছে তার সাথে আমি একমত। উদাহরণ তাকান। আপনার একটি পদ্ধতি রয়েছে তা বিবেচনা করুন:

class A {
    public void foo(OtherClass other) {
        SomeData data = new SomeData("Some inner data");
        other.doSomething(data);
    }
}

এখন আপনি যদি অভ্যন্তরীণ ডেটা পরীক্ষা করতে চান তবে আপনি বন্দী ব্যবহার করতে পারেন:

// Create a mock of the OtherClass
OtherClass other = mock(OtherClass.class);

// Run the foo method with the mock
new A().foo(other);

// Capture the argument of the doSomething function
ArgumentCaptor<SomeData> captor = ArgumentCaptor.forClass(SomeData.class);
verify(other, times(1)).doSomething(captor.capture());

// Assert the argument
SomeData actual = captor.getValue();
assertEquals("Some inner data", actual.innerData);

যদি doSomething(data)মিউটেটস হয় innerData, তবে সেই পরিবর্তনটি কি উপস্থিত assertEquals("Some inner data", actual.innerData)থাকবে, বা মৃত্যুদন্ড কার্যকর হওয়ার আগে যেমন innerDataধরা পড়বে ? doSomething
Cory Klein

@ কৌরিক্লাইন OtherClassএটি একটি উপহাস এবং এটি এখন সংজ্ঞায়িত হয়েছে যে প্রকৃতপক্ষে doSomething()কিছুই করা হবে না, এটি কেবল পাস করা বস্তুটি রেকর্ড করে। এর অর্থ এটি doSomethingকার্যকর হওয়ার আগে এটি যেমন ধরা পড়বে ।
স্লাভা শিপিটালির

3
ইন verify, times(1)ডিফল্ট এবং বাদ দেওয়া যেতে পারে।
Inego

আরগামেন্টক্যাপ্টর কীভাবে জানবে যে foo (অন্যান্য) ঘটেছিল যেহেতু এটি কেবল foo (অন্যান্য) কল করার পরে ইনস্ট্যান্ট করা হয়?
অভ্রামপপ

1
@ আব্রামপপ যিনি জানেন এটি মক অবজেক্ট। এটিতে মোক সম্পর্কে অনেক তথ্য রয়েছে inside সেই সমস্ত তথ্যের অভ্যন্তরে এটির প্রতিটি পরামিতিগুলির প্যারামিটারগুলির সাথে কল ইতিহাসও রয়েছে। আপনি যখন verifyপদ্ধতিটি কল করেন , আপনি যে যাচাই করছেন তার বিপরীতে ম্যাচগুলি চালানোর জন্য এটি সেই তথ্য ব্যবহার করে। প্রতিটি প্যারামিটারের জন্য এটি জিজ্ঞাসা করে যে এটি নির্দিষ্ট কল এটির সাথে চেক করে matches যখন আর্গুমেন্টক্যাপ্টরটি চেক করা হয়, এটি কেবল তখনই মানগুলি সংরক্ষণ করে যখন verifyএটি শেষ হওয়ার সাথে সাথে শেষ হয়, এটি সমস্ত প্রাসঙ্গিক আমন্ত্রণগুলি ধারণ করে। মোটামুটি এটি কীভাবে কাজ করে তা। আশা করি এটি সহায়তা করে
স্লাভা শিপিটালি

35

দুটি প্রধান পার্থক্য হ'ল:

  • আপনি যখন একটি একক যুক্তি ক্যাপচার করেন, আপনি এই যুক্তিটি এবং আরও সুস্পষ্ট কোড সহ আরও অনেক বিস্তৃত পরীক্ষা করতে সক্ষম হন;
  • একটি ArgumentCaptorক্যাপচার করতে পারেন আরো একবারের।

পরবর্তী চিত্রটির জন্য, আপনার কাছে বলুন:

final ArgumentCaptor<Foo> captor = ArgumentCaptor.forClass(Foo.class);

verify(x, times(4)).someMethod(captor.capture()); // for instance

তারপরে বন্দিদশা আপনাকে সমস্ত 4 টি আর্গুমেন্টে অ্যাক্সেস দিতে সক্ষম হবেন, যা আপনি পৃথকভাবে দৃ .়তার সাথে সম্পাদন করতে পারেন।

এটি বা আসলে কোনও সংখ্যক যুক্তি, যেহেতু একটি VerificationModeএকটি নির্দিষ্ট সংখ্যক প্রার্থনার জন্য সীমাবদ্ধ নয়; যে কোনও ইভেন্টে, বন্দী আপনি যদি চান তবে তাদের সকলের অ্যাক্সেস দেবেন।

এর দ্বারা এই সুবিধাটিও পাওয়া যায় যে এই জাতীয় পরীক্ষাগুলি আপনার নিজের প্রয়োগ করার চেয়ে লেখার পক্ষে আরও সহজ (ইমো) ArgumentMatcher- বিশেষত যদি আপনি অ্যাসেটের সাথে মকিতোকে একত্রিত করেন।

ওহ, এবং দয়া করে JUnit এর পরিবর্তে TestNG ব্যবহার বিবেচনা করুন।


1
যদি একাধিক পরামিতি পদ্ধতিতে পাস করা হয় - তবে বিভিন্ন ধরণের? আপনি কীভাবে বাস্তবে যাচাই করবেন যে উদাহরণস্বরূপ, বুলিয়ান প্যারামিটারটি সত্য ছিল ।
ইগোরগানাপলস্কি

21
আপনি কি আপনার মন্তব্যের জন্য একটি ব্যাখ্যা সরবরাহ করতে পারেন: ওহ, এবং দয়া করে JUnit এর পরিবর্তে TestNG ব্যবহার করার বিষয়টি বিবেচনা করুন। । কেন এটি বিবেচনা? কেন পরিবর্তন?
নাভিগাট্রন

1
@ আইগরগানাপলস্কি আপনি কেবল আর একটি আর্গুমেন্টক্যাপ্টর যুক্ত করেছেন। আর্গুমেন্টক্যাপ্টর <বিগডিসিমাল> আরগ = আরগমেন্ট ক্যাপ্টর.ফোর্স ক্লাস (বিগডিসিমাল.class); আর্গুমেন্টক্যাপ্টর <স্ট্রিং> আরগ 2 = আর্গুমেন্টক্যাপ্টর.ফোর্স ক্লাস (স্ট্রিং.ক্লাস); মাইকেল মাইকেল = নতুন মাইকেল (); michael.sayHi (ঞ); যাচাই করুন (জে) .সায়সামিংথিং (আরগ.ক্যাপচার (), আরগ 2 ক্যাপচার ()); System.out.println ("মান হ'ল" + arg.getValue ()); System.out.println ("স্ট্রিংটি হল" + arg2.getValue ());
johnwick0831

12

একটি সম্পূর্ণ চেক করার জন্য পদক্ষেপগুলি হ'ল:

বন্দী প্রস্তুত করুন:

ArgumentCaptor<SomeArgumentClass> someArgumentCaptor = ArgumentCaptor.forClass(SomeArgumentClass.class);

উপাদানটি (পরীক্ষার অধীনে বিষয়টির সহযোগী) সময় (1) এর উপর নির্ভরশীল কলটি যাচাই করুন ডিফল্ট মান, সুতরাং এটি যুক্ত করা দরকার।

verify(dependentOnComponent, times(1)).send(someArgumentCaptor.capture());

সহযোগীর কাছে তর্কটি পাস করুন

SomeArgumentClass someArgument = messageCaptor.getValue();

কিছু অরগমেন্টটি দৃser়তার জন্য ব্যবহার করা যেতে পারে


-2

এখানে আমি আপনাকে একটি কলব্যাক পদ্ধতির যথাযথ উদাহরণ দিচ্ছি। সুতরাং ধরুন আমাদের কাছে পদ্ধতি লগইনের মতো একটি পদ্ধতি রয়েছে ():

 public void login() {
    loginService = new LoginService();
    loginService.login(loginProvider, new LoginListener() {
        @Override
        public void onLoginSuccess() {
            loginService.getresult(true);
        }

        @Override
        public void onLoginFaliure() {
            loginService.getresult(false);

        }
    });
    System.out.print("@@##### get called");
}

উদাহরণটি আরও স্পষ্ট করার জন্য আমি এখানে সমস্ত সহায়ক শ্রেণিকে রেখেছি: লগইনসোভারি ক্লাস

public class LoginService implements Login.getresult{
public void login(LoginProvider loginProvider,LoginListener callback){

    String username  = loginProvider.getUsername();
    String pwd  = loginProvider.getPassword();
    if(username != null && pwd != null){
        callback.onLoginSuccess();
    }else{
        callback.onLoginFaliure();
    }

}

@Override
public void getresult(boolean value) {
    System.out.print("login success"+value);
}}

এবং আমাদের কাছে শ্রোতা লগইনলাইজন রয়েছে:

interface LoginListener {
void onLoginSuccess();

void onLoginFaliure();

}

এখন আমি ক্লাস লগইনের পদ্ধতি লগইন () পরীক্ষা করতে চেয়েছিলাম

 @Test
public void loginTest() throws Exception {
    LoginService service = mock(LoginService.class);
    LoginProvider provider = mock(LoginProvider.class);
    whenNew(LoginProvider.class).withNoArguments().thenReturn(provider);
    whenNew(LoginService.class).withNoArguments().thenReturn(service);
    when(provider.getPassword()).thenReturn("pwd");
    when(provider.getUsername()).thenReturn("username");
    login.getLoginDetail("username","password");

    verify(provider).setPassword("password");
    verify(provider).setUsername("username");

    verify(service).login(eq(provider),captor.capture());

    LoginListener listener = captor.getValue();

    listener.onLoginSuccess();

    verify(service).getresult(true);

পরীক্ষার শ্রেণীর উপরে টীকা যুক্ত করতে ভুলবেন না forget

@RunWith(PowerMockRunner.class)
@PrepareForTest(Login.class)

1
এটি কি আর্গুমেন্টক্যাপ্টরকে উল্লেখ করা উচিত নয়?
ফিলিপ মার্টিনস মেলো

হ্যাঁ আমরা পদ্ধতি লগইনে পাস শ্রোতাদের ক্যাপচার করছি () উদাহরণস্বরূপ লগইন (লগইনপ্রোভাইডার লগইনপ্রভাইডার, লগইনলাইজনার কলব্যাক)
বিক্রম সিং

captorআপনার উত্তরে সংজ্ঞায়িত কোথায় ?
tom_mai78101

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