java - अगली बार इसे कॉल करने के लिए कुछ अलग करने के लिए मॉकिटो मॉक ऑब्जेक्ट को कैसे बताना है?




unit-testing junit (2)

इसलिए, मैं कक्षा स्तर पर एक स्थिर चर के रूप में एक नकली वस्तु बना रहा हूं ... एक परीक्षण में, मैं एक निश्चित मान वापस करने के लिए Foo.someMethod() चाहता Foo.someMethod() , जबकि एक और परीक्षण में, मैं इसे वापस लौटना चाहता हूं अलग मूल्य मेरी समस्या यह है कि ऐसा लगता है कि इसे ठीक से काम करने के लिए मुझे मोज़े का पुनर्निर्माण करने की आवश्यकता है। मैं mocks के पुनर्निर्माण से बचना चाहता हूं, और केवल प्रत्येक परीक्षण में एक ही वस्तु का उपयोग करें।

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 प्राप्त कर रहा हूं जब testObj.bar () कहा जाता है ... इसे हल करने का सबसे अच्छा तरीका क्या है? ध्यान दें कि मुझे पता है कि मैं प्रत्येक परीक्षण में Foo एक अलग नकली का उपयोग कर सकता हूं, हालांकि, मुझे mockFoo से कई अनुरोधों को चेन करना mockFoo , जिसका अर्थ है कि मुझे प्रत्येक टेस्ट में चेनिंग करना होगा।


आप कॉन्बक्यूटिव कॉल भी कर सकते हैं (2.8.9 2.8 में एपीआई)। इस मामले में, आप कई पैरामीटर कॉल या एक पैरामीटर कॉल एकाधिक पैरामीटर (varargs) के साथ उपयोग करेंगे।

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
    }
}

जब () विधि के बजाय जासूस () और doReturn () का उपयोग करने वाले किसी के लिए:

अलग-अलग कॉल पर आपको अलग-अलग ऑब्जेक्ट को वापस करने की आवश्यकता क्या है:

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




mockito