পরের বার যখন ডাকা হবে তখন কোনও মকিতো মক অবজেক্টকে কী আলাদা বলবে?


202

সুতরাং, আমি শ্রেণি পর্যায়ে যেমন স্থির পরিবর্তনশীল হিসাবে একটি মক অবজেক্ট তৈরি করছি ... একটি পরীক্ষায়, আমি Foo.someMethod()একটি নির্দিষ্ট মান ফিরিয়ে দিতে চাই , অন্য পরীক্ষায়, আমি এটির চেয়ে আলাদা মানটি ফিরিয়ে দিতে চাই। আমার যে সমস্যা হচ্ছে তা হ'ল মনে হচ্ছে এগুলি সঠিকভাবে কাজ করার জন্য আমার পোকা পুনর্নির্মাণ করা দরকার। আমি মোকগুলি পুনর্নির্মাণ এড়াতে চাই এবং প্রতিটি পরীক্ষায় কেবল একই জিনিস ব্যবহার করতে চাই।

class TestClass {

    private static Foo mockFoo;

    @BeforeClass
    public static void setUp() {
        mockFoo = mock(Foo.class);
    }

    @Test
    public void test1() {
        when(mockFoo.someMethod()).thenReturn(0);

        TestObject testObj = new TestObject(mockFoo);

        testObj.bar(); // calls mockFoo.someMethod(), receiving 0 as the value

    }

    @Test
    public void test2() {
        when(mockFoo.someMethod()).thenReturn(1);

        TestObject testObj = new TestObject(mockFoo);

        testObj.bar(); // calls mockFoo.someMethod(), STILL receiving 0 as the value, instead of expected 1.

    }

}

দ্বিতীয় পরীক্ষায়, টেস্টবজ.বার () বলা হলে আমি এখনও মান হিসাবে 0 পেয়ে যাচ্ছি ... এটি সমাধানের সর্বোত্তম উপায় কোনটি? নোট করুন যে আমি জানি যে আমি Fooপ্রতিটি পরীক্ষায় একটি ভিন্ন উপহাস ব্যবহার করতে পারি , তবে, আমাকে একাধিক অনুরোধ বন্ধ রাখতে হবে mockFoo, অর্থাত প্রতিটি পরীক্ষায় আমাকে শৃঙ্খলাবদ্ধ করতে হবে।

উত্তর:


43

প্রথমে মোকটিকে স্থির করবেন না। এটি একটি ব্যক্তিগত ক্ষেত্র করুন। শুধু আপনার সেটআপ বর্গ করা @Beforeনা @BeforeClass। এটি একটি গুচ্ছ চালানো হতে পারে, তবে এটি সস্তা।

দ্বিতীয়ত, এখন আপনার কাছে যেভাবে রয়েছে তা হ'ল পরীক্ষার উপর নির্ভর করে ভিন্ন কিছু ফেরত দেওয়ার জন্য উপহাস পাওয়ার সঠিক উপায়।


438

আপনি একটানা কল করতে পারেন (২.৮.৯ এপি তে # 10) এই ক্ষেত্রে, আপনি একাধিক ব্যবহার করেন thenReturn কল অথবা এক thenReturn একাধিক পরামিতি (ভারার্গস) সঙ্গে কল।

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import org.junit.Before;
import org.junit.Test;

public class TestClass {

    private Foo mockFoo;

    @Before
    public void setup() {
        setupFoo();
    }

    @Test
    public void testFoo() {
        TestObject testObj = new TestObject(mockFoo);

        assertEquals(0, testObj.bar());
        assertEquals(1, testObj.bar());
        assertEquals(-1, testObj.bar());
        assertEquals(-1, testObj.bar());
    }

    private void setupFoo() {
        mockFoo = mock(Foo.class);

        when(mockFoo.someMethod())
            .thenReturn(0)
            .thenReturn(1)
            .thenReturn(-1); //any subsequent call will return -1

        // Or a bit shorter with varargs:
        when(mockFoo.someMethod())
            .thenReturn(0, 1, -1); //any subsequent call will return -1
    }
}

171
আমি মনে করি আপনি এটি ব্যবহার করতে পারেন যে। পুনরায় () ভ্যারাগস নেয় তাই কোডটি সংক্ষিপ্ত করা যায়: কখন (mockFoo.someMethod ()) তারপর পুনরায় (0, 1, -1);
জাস্টিন মুলার

10
@ জাস্টিনমুলার - এটি একটি পৃথক উত্তর মূল্য, আমি মনে করি (একটি মন্তব্যের বিপরীতে)
ব্রায়ান

16
এই উত্তরটি এই ক্ষেত্রে সঠিক জিনিস নয়। আপনি 0 এবং 1 ফিরতে এই পদ্ধতি শহরের উপর অসম্পূর্ণ নিবন্ধ, তাহলে আপনি জরিমানা এতক্ষণ আপনি চালাতে যেমন হবেন test1এবং তারপর test2। তবে এটি এমন হতে পারে যে আপনার ক্রমাগত সংহতকরণ পরিবেশটি অন্য ক্রমে পরীক্ষাগুলি পরিচালনা করবে। অথবা এটি এমন হতে পারে যে আপনি test2নিজেই চালাতে চান , test1প্রথমে না চালানো ছাড়া, কোনও ক্ষেত্রে এটি ব্যর্থ হবে। ইউনিট পরীক্ষা সর্বদা একে অপরের থেকে স্বতন্ত্র থাকতে হবে; এবং পৃথক পরীক্ষাগুলির মধ্যে কখনও নির্ভরতা বা পরীক্ষাগুলির নির্দিষ্ট ক্রমের উপর নির্ভরতা থাকা উচিত নয় । যদিও শৃঙ্খলা thenReturnবিবৃতি ...
দাউদ ইবনে কেরেম

4
... এর ব্যবহার রয়েছে, যেমন একক জন্য ভারার্গস ব্যবহার করে thenReturn, এটি এই বিশেষ ক্ষেত্রে সঠিক সমাধান নয়। আমার কাছে মনে হচ্ছে এখানকার upvoters এর দলটি সম্ভবত প্রশ্নটি বুঝতে ব্যর্থ হয়েছে।
দাউদ ইবনে কেরেম

2
জুনিট নিজেই পরীক্ষার অর্ডার নিশ্চিত করে না@FixMethodOrder
রজার

29

যারা কিছু ফেরত দেওয়ার জন্য অনুসন্ধান করেন তাদের জন্য এবং তারপরে অন্য কল থ্রো ব্যতিক্রমের জন্য:

    when(mockFoo.someMethod())
            .thenReturn(obj1)
            .thenReturn(obj2)
            .thenThrow(new RuntimeException("Fail"));

অথবা

    when(mockFoo.someMethod())
            .thenReturn(obj1, obj2)
            .thenThrow(new RuntimeException("Fail"));


14

স্পাই () এবং doReturn () ব্যবহার করার জন্য যে কেউ (কখন) পদ্ধতির পরিবর্তে:

বিভিন্ন কলগুলিতে আপনাকে বিভিন্ন অবজেক্টটি ফিরিয়ে দেওয়ার কী তা হ'ল:

doReturn(obj1).doReturn(obj2).when(this.spyFoo).someMethod();

ক্লাসিক উপহাসের জন্য:

when(this.mockFoo.someMethod()).thenReturn(obj1, obj2);

বা একটি ব্যতিক্রম সঙ্গে নিক্ষেপ করা হচ্ছে:

when(mockFoo.someMethod())
        .thenReturn(obj1)
        .thenThrow(new IllegalArgumentException())
        .thenReturn(obj2, obj3);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.