java - हंसी मजाक वीडियो




अंतिम विधि मजाक कर रहा है (4)

आप पॉमर्मॉक को मॉकिटो के साथ एक साथ उपयोग कर सकते हैं, तो आपको बीक्लास को उपclass करने की आवश्यकता नहीं है। बस इसे अपने टेस्ट क्लास के शीर्ष पर जोड़ें

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

@PrepareForTest अंतिम और स्थैतिक तरीकों को मजाक बनाने के लिए Powermock को उपकरण बीक्लास को निर्देश देता है। इस दृष्टिकोण का एक नुकसान यह है कि आपको PowerMockRunner का उपयोग करना चाहिए जो स्प्रिंग टेस्ट धावक जैसे अन्य परीक्षण धावकों के उपयोग को रोकता है।

मुझे मॉकिटो का उपयोग करके अंतिम विधि के साथ कुछ वर्ग की नकल की ज़रूरत है। मैंने ऐसा कुछ लिखा है

@Test
public void test() {
    B b = mock(B.class);
    doReturn("bar called").when(b).bar();   
    assertEquals("must be \"overrided\"", "bar called", b.bar());
    //bla-bla
}


class B {
    public final String bar() {
        return "fail";
    }
}

लेकिन यह विफल रहता है। मैंने कुछ "हैक" की कोशिश की और यह काम करता है।

   @Test
   public void hackTest() {
        class NewB extends B {
            public String barForTest() {
                return bar();
            }
        }
        NewB b = mock(NewB.class);
        doReturn("bar called").when(b).barForTest();
        assertEquals("must be \"overrided\"", "bar called", b.barForTest());
    }

यह काम करता है, लेकिन "बदबू आ रही है"।

तो, सही तरीका कहां है?

धन्यवाद।


मैंने अभी भी यही काम किया है। मेरा मामला यह था कि मैं यह सुनिश्चित करना चाहता था कि विधि "कारण" नहीं है, लेकिन चूंकि यह एक पकड़ / लॉग / वापसी विधि है, इसलिए मैं कक्षा को संशोधित किए बिना सीधे इसके लिए परीक्षण नहीं कर सका।

मैं बस लॉग इन करने के लिए लॉग इन करना चाहता था, लेकिन "लॉग" इंटरफ़ेस का मज़ाक उड़ाते हुए कुछ काम नहीं कर रहा था और "सरल लॉग" जैसी कक्षा को मॉक करना काम नहीं कर रहा था क्योंकि ये विधियां अंतिम हैं।

मैं सरल अज्ञात वर्ग को विस्तारित करता हूं जो आधार-स्तर "लॉग (स्तर, स्ट्रिंग, त्रुटि)" विधि को ओवरराइड करता है जो अन्य सभी प्रतिनिधि होते हैं, फिर बस 5 के "स्तर" के साथ कॉल की प्रतीक्षा करते हैं।

आम तौर पर, व्यवहार के लिए कक्षा का विस्तार करना वास्तव में एक बुरा विचार नहीं है, अगर यह बहुत जटिल नहीं है तो किसी भी तरह से मजाक करना बेहतर हो सकता है।


मॉकिटो में अंतिम विधियों का मज़ाक उड़ाने के लिए कोई समर्थन नहीं है।

जैसा कि जॉन स्कीट ने टिप्पणी की थी कि आपको अंतिम विधि पर निर्भरता से बचने के लिए एक रास्ता तलाशना चाहिए। उस ने कहा, बाइटकोड मैनिपुलेशन के माध्यम से कुछ तरीके हैं (उदाहरण के लिए पावरमोक के साथ)

मॉकिटो और पावरमोक के बीच की तुलना में चीजों को विस्तार से समझाया जाएगा।


यह मानते हुए कि बी वर्ग नीचे जैसा है:

class B {
    private String barValue;
    public final String bar() {
        return barValue;
    }
    public void final setBar(String barValue) {
        this.barValue = barValue;
    }
}

PowerMockito ढांचे का उपयोग किए बिना ऐसा करने का एक बेहतर तरीका है। आप अपनी कक्षा के लिए एक एसपीवाई बना सकते हैं और अपनी अंतिम विधि का नकल कर सकते हैं। इसे करने का तरीका नीचे है:

@Test
public void test() {

    B b  = new B();
    b.setBar("bar called") //This should the expected output:final_method_bar()
    B spyB = Mockito.spy(b);
    assertEquals("bar called", spyB.bar());

}






mockito