একই তর্কযুক্ত একই পদ্ধতিতে একাধিক কল সহ মকিতো ব্যবহার করা


289

পরবর্তী সময়ে অনুরোধে কোনও স্ট্যাবড পদ্ধতি বিভিন্ন জিনিস ফেরত দেওয়ার কোনও উপায় আছে কি? আমি একটি থেকে নির্ধারিত প্রতিক্রিয়া পরীক্ষা করতে এটি করতে চাই ExecutorCompletionService। অর্থাত্ পদ্ধতিগুলির রিটার্ন ক্রম নির্বিশেষে পরীক্ষা করার জন্য, ফলাফলটি স্থির থাকে।

কোডটি আমি যাচাই করতে দেখছি এটির মতো কিছু দেখাচ্ছে।

// Create an completion service so we can group these tasks together
ExecutorCompletionService<T> completionService =
        new ExecutorCompletionService<T>(service);

// Add all these tasks to the completion service
for (Callable<T> t : ts)
    completionService.submit(request);

// As an when each call finished, add it to the response set.
for (int i = 0; i < calls.size(); i ++) {
    try {
        T t = completionService.take().get();
        // do some stuff that I want to test
    } catch (...) { }        
}

উত্তর:


254

আপনি thenAnswerপদ্ধতিটি (যখন শৃঙ্খলাবদ্ধ হয়ে when) ব্যবহার করে এটি করতে পারেন :

when(someMock.someMethod()).thenAnswer(new Answer() {
    private int count = 0;

    public Object answer(InvocationOnMock invocation) {
        if (count++ == 1)
            return 1;

        return 2;
    }
});

বা সমতুল্য, স্থির doAnswerপদ্ধতি ব্যবহার করে :

doAnswer(new Answer() {
    private int count = 0;

    public Object answer(InvocationOnMock invocation) {
        if (count++ == 1)
            return 1;

        return 2;
    }
}).when(someMock).someMethod();

634

কেমন

when( method-call ).thenReturn( value1, value2, value3 );

আপনি যতটা যুক্তি ততক্ষণে আবার বন্ধুর বন্ধনীগুলিতে পছন্দ করতে পারেন তবে শর্ত থাকে যে তারা সমস্ত সঠিক টাইপ রয়েছে। পদ্ধতিটি যখন প্রথমবার বলা হবে তখন প্রথম মানটি ফেরত দেওয়া হবে, তারপরে দ্বিতীয় উত্তর এবং আরও অনেক কিছু। অন্য সমস্ত মান ব্যবহৃত হয়ে গেলে শেষ মানটি বারবার ফিরে আসবে।


4
এটি মক দিয়ে কাজ করবে তবে কোনও গুপ্তচর দিয়ে নয় with যদি আপনার আসল পদ্ধতিটি কল করা রোধ করতে হয় আপনার প্রয়োজন doAnswer (...) .কখন (someSpy) .সোমমথড (...)।
ইউরি

6
@ ইউরি - বেশ না আপনি যে ক্ষেত্রে উল্লেখ করেছেন তাতে আপনার প্রয়োজন doAnswerবা একটি লেখার দরকার নেই Answer। আপনি শুধু ব্যবহার করতে পারেন doReturn(...).when(someSpy).someMethod(...)। এটি ধরে নেওয়া যুক্তিসঙ্গত বলে মনে হয় যে এমা গুপ্তচরবৃত্তির পরিবর্তে উপহাসের প্রতি আগ্রহী, তবে আমি অনুমান করি যে আমি এই উত্তরটি যুক্ত করতে আমার উত্তরে কিছু যুক্ত করতে পারলাম। মন্তব্যের জন্য ধন্যবাদ.
দাউদ ইবনে কেরেম

@ দাউদিবনক্যারিম প্রথম কলটির জন্য বলতে চাই যে আমি একটি মান ফিরিয়ে দিতে চাই এবং দ্বিতীয় কলটির জন্য আমি একটি ব্যতিক্রম ছুঁড়ে দিতে চাই। কিভাবে এই কাজ করা যেতে পারে?
রিতো

@ রিতো দয়া করে ভলডোমায়ারের উত্তর বা রায়স্টর্মের উত্তরটি পড়ুন। তারা উভয়ই এই মামলাটি coverেকে রাখে।
দাউদ ইবনে কেরেম

এরকম গৌরবময় উত্তর
ওয়াইল্ড_নিংসিং

151

পূর্বে উল্লিখিত হিসাবে প্রায় সমস্ত কল চেইনযোগ্য হয়।

সুতরাং আপনি কল করতে পারে

when(mock.method()).thenReturn(foo).thenReturn(bar).thenThrow(new Exception("test"));

//OR if you're mocking a void method and/or using spy instead of mock

doReturn(foo).doReturn(bar).doThrow(new Exception("Test").when(mock).method();

মকিতোর ডকুমেন্টেশনে আরও তথ্য ।


3
খুব উপকারী! mock.methodএই উদাহরণে চতুর্থবারের মতো কী বলা হত? আমি এর মতো কিছু চাই, প্রথমবার foo ফিরে আসি তবে বাকী সকলের জন্য বারটি ফিরে আসুন।
javaPlease42

6
উপহাসের প্রতিটি অতিরিক্ত অনুরোধ সর্বশেষ 'তত্কালীন পুনরায়' বা শেষ 'ততক্ষণ' ফিরিয়ে দেবে খুব দরকারী
ফ্রাঙ্কোইস ল্যাকোরসিয়ের

দুর্দান্ত এবং সাধারণ নির্দেশাবলীর জন্য আপনাকে ধন্যবাদ। এখনও অবধি এটি জানতেন না। দুটি অভিন্ন কলটিতে কীভাবে দুটি পৃথক ফলাফল ফিরে পাওয়া যায় তা সন্ধান করার জন্য আমি লড়াই করে যাচ্ছিলাম। আমাকে অনেক সময় বাঁচান
চার্লসসি


4

আমি একটি MultipleAnswerক্লাস প্রয়োগ করেছি যা আমাকে প্রতিটি কলে বিভিন্ন উত্তর আটকে রাখতে সহায়তা করে। এখানে কোড টুকরা:

private final class MultipleAnswer<T> implements Answer<T> {

    private final ArrayList<Answer<T>> mAnswers;

    MultipleAnswer(Answer<T>... answer) {
        mAnswers = new ArrayList<>();
        mAnswers.addAll(Arrays.asList(answer));
    }

    @Override
    public T answer(InvocationOnMock invocation) throws Throwable {
        return mAnswers.remove(0).answer(invocation);
    }
}

1
আপনি কি এই বিষয়টিকে সংক্ষিপ্ত, সহজ এবং পঠনযোগ্য উপায়ে সূচনা করতে পারেন?
usr-local-ΕΨΗΕΛΩΝ

1

বিভিন্ন পদ্ধতি কলগুলিতে বিভিন্ন যুক্তি ফিরিয়ে দেওয়ার জন্য নিম্নলিখিতগুলি একটি সাধারণ পদ্ধতি হিসাবে ব্যবহার করা যেতে পারে। কেবলমাত্র আমাদের যা করতে হবে তা হ'ল আমাদের একটি ক্রমানুসারে পাঠানো দরকার যাতে প্রতিটি কলটিতে অবজেক্টগুলি পুনরুদ্ধার করা উচিত।

@SafeVarargs
public static <Mock> Answer<Mock> getAnswerForSubsequentCalls(final Mock... mockArr) {
    return new Answer<Mock>() {
       private int count=0, size=mockArr.length;
       public Mock answer(InvocationOnMock invocation) throws throwable {
           Mock mock = null;
           for(; count<size && mock==null; count++){
                mock = mockArr[count];
           }

           return mock;    
       } 
    }
}

যাত্রা। getAnswerForSubsequentCalls(mock1, mock3, mock2);প্রথম কলটিতে মক 1 অবজেক্ট, দ্বিতীয় কলটিতে মক 3 অবজেক্ট এবং তৃতীয় কলটিতে মক 2 অবজেক্ট ফিরে আসবে। মত ব্যবহার করা উচিত when(something()).doAnswer(getAnswerForSubsequentCalls(mock1, mock3, mock2)); এই প্রায় অনুরূপwhen(something()).thenReturn(mock1, mock3, mock2);


এই সমাধানটি আমার পক্ষে কাজ করেছিল। ধন্যবাদ।
ভ্যালেরি

1

@ [ইগর নিকোলাভ] এর উত্তর সম্পর্কিত 8 বছর আগে থেকে, জাভা 8 এ উপলব্ধ ল্যাম্বডা এক্সপ্রেশনটিAnswer ব্যবহার করে কিছুটা সহজ করা যায় ।

when(someMock.someMethod()).thenAnswer(invocation -> {
    doStuff();
    return;
});

বা আরও সহজভাবে:

when(someMock.someMethod()).thenAnswer(invocation -> doStuff());

1

বিডিডি শৈলী:

import static org.mockito.BDDMockito.*;
...
    @Test
    void submit() {
        given(yourMock.yourMethod()).willReturn(1, 2, 3);

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