जावा में नकली वस्तुएं बनाने के लिए सबसे अच्छा ढांचा क्या है? क्यों? प्रत्येक रूपरेखा के पेशेवरों और विपक्ष क्या हैं?
जावा में नकली वस्तुएं बनाने के लिए सबसे अच्छा ढांचा क्या है? क्यों? प्रत्येक रूपरेखा के पेशेवरों और विपक्ष क्या हैं?
जवाबों:
मुझे मॉकिटो का उपयोग करके अच्छी सफलता मिली है ।
जब मैंने JMock और EasyMock के बारे में जानने की कोशिश की, तो मैंने सीखने की अवस्था को थोड़ा स्थिर पाया (हालाँकि शायद यह सिर्फ मेरे लिए है)।
मुझे इसकी सरल और साफ वाक्य रचना के कारण मॉकिटो पसंद है जिसे मैं बहुत जल्दी समझ पाने में सक्षम था। न्यूनतम सिंटैक्स को आम मामलों का अच्छी तरह से समर्थन करने के लिए डिज़ाइन किया गया है, हालांकि कुछ समय के लिए मुझे कुछ और अधिक जटिल करने की आवश्यकता थी जो मुझे मिला था जो मुझे चाहिए था और आसानी से समझ में आया।
यहाँ मॉकिटो मुखपृष्ठ से (संक्षिप्त) उदाहरण दिया गया है:
import static org.mockito.Mockito.*;
List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();
यह उससे ज्यादा सरल नहीं है।
केवल मुख्य नकारात्मक पक्ष मैं यह सोच सकता हूं कि यह स्थैतिक तरीकों का मजाक नहीं उड़ाएगा।
मैं PowerMock का निर्माता हूं, तो जाहिर है मुझे इसकी सिफारिश करनी चाहिए! :-)
PowerMock, EasyMock और Mockito दोनों को स्थिर विधियों , अंतिम और यहां तक कि निजी विधियों की नकल करने की क्षमता तक बढ़ाता है । ईज़ीमॉक सपोर्ट पूरा हो गया है, लेकिन मॉकिटो प्लगइन को कुछ और काम करने की ज़रूरत है। हम JMock समर्थन को भी जोड़ने की योजना बना रहे हैं।
पॉवरमॉक का उद्देश्य अन्य फ्रेमवर्क को बदलना नहीं है, बल्कि इसका उपयोग मुश्किल परिस्थितियों में किया जा सकता है जब अन्य फ्रेमवर्क मॉकिंग की अनुमति नहीं देते हैं। पावरमॉक में अन्य उपयोगी विशेषताएं भी हैं जैसे स्थैतिक इनिशियलाइज़र और कंस्ट्रक्टर्स को दबाना ।
JMockit परियोजना स्थल वर्तमान मजाक उपकरणकिटें के लिए तुलनात्मक जानकारी के बहुत सारे हैं।
विशेष रूप से, सुविधा तुलना मैट्रिक्स की जांच करें , जिसमें ईज़ीमॉक, जेमॉक, मॉकिटो, यूनिट्स मॉक, पावरमॉक और निश्चित रूप से जेमॉकिट शामिल हैं। मैं इसे यथासंभव सटीक और अद्यतित रखने की कोशिश करता हूं।
मुझे JMockit से सफलता मिली है ।
यह बहुत नया है, और इसलिए यह थोड़ा कच्चा और कम-प्रलेखित है। यह क्लास बायोटेक को गतिशील रूप से पुनर्परिभाषित करने के लिए एएसएम का उपयोग करता है, इसलिए यह स्टेटिक, प्राइवेट, कंस्ट्रक्टर और स्टैटिक इनिशियलाइज़र सहित सभी तरीकों का मज़ाक उड़ा सकता है। उदाहरण के लिए:
import mockit.Mockit;
...
Mockit.redefineMethods(MyClassWithStaticInit.class,
MyReplacementClass.class);
...
class MyReplacementClass {
public void $init() {...} // replace default constructor
public static void $clinit{...} // replace static initializer
public static void myStatic{...} // replace static method
// etc...
}
इसमें एक्सपेक्टेशंस इंटरफ़ेस की अनुमति है जो रिकॉर्ड / प्लेबैक परिदृश्यों को भी अनुमति देता है:
import mockit.Expectations;
import org.testng.annotations.Test;
public class ExpecationsTest {
private MyClass obj;
@Test
public void testFoo() {
new Expectations(true) {
MyClass c;
{
obj = c;
invokeReturning(c.getFoo("foo", false), "bas");
}
};
assert "bas".equals(obj.getFoo("foo", false));
Expectations.assertSatisfied();
}
public static class MyClass {
public String getFoo(String str, boolean bool) {
if (bool) {
return "foo";
} else {
return "bar";
}
}
}
}
नकारात्मक पक्ष यह है कि इसके लिए जावा 5/6 की आवश्यकता होती है।
तुम भी Groovy का उपयोग कर परीक्षण पर एक नज़र हो सकता है। Groovy में आप आसानी से 'के रूप में' ऑपरेटर का उपयोग करके जावा इंटरफेस का मज़ाक उड़ा सकते हैं:
def request = [isUserInRole: { roleName -> roleName == "testRole"}] as HttpServletRequest
इस बुनियादी कार्यक्षमता के अलावा ग्रूवी शक्तिशाली MockFor
और StubFor
कक्षाओं सहित मोर्चे पर बहुत अधिक प्रदान करता है ।
मैंने EasyMock के साथ मोक्स का उपयोग करना शुरू कर दिया । समझने में काफी आसान है, लेकिन रिप्ले स्टेप थोड़े कष्टप्रद था। मॉकिटो इसे हटाता है, इसमें एक क्लीनर सिंटैक्स भी है क्योंकि ऐसा लगता है कि पठनीयता इसके प्राथमिक लक्ष्यों में से एक थी। मैं इस बात पर जोर नहीं दे सकता कि यह कितना महत्वपूर्ण है, क्योंकि अधिकांश डेवलपर्स अपना समय पढ़ने और मौजूदा कोड को बनाए रखने, इसे बनाने में नहीं बिताएंगे।
एक और अच्छी बात यह है कि ईज़ीमॉक के विपरीत इंटरफेस और इंप्लीमेंटेशन क्लास को एक ही तरह से हैंडल किया जाता है, जहाँ अभी भी आपको ईज़ीमॉक क्लास एक्सटेंशन का उपयोग करने के लिए याद रखना (और जांचना) आवश्यक है।
मैंने JMockit पर एक त्वरित नज़र डाली है हाल ही , और जबकि सुविधाओं की कपड़े धोने की सूची बहुत व्यापक है, मुझे लगता है कि इस की कीमत परिणामी कोड की विरासत है, और अधिक लिखने के लिए।
मेरे लिए, मॉकिटो मीठा स्थान हिट करता है, लिखना और पढ़ना आसान है, और अधिकांश परिस्थितियों से निपटने के लिए अधिकांश कोड की आवश्यकता होगी। का उपयोग करते हुए Mockito साथ PowerMock मेरी पसंद होगा।
विचार करने के लिए एक बात यह है कि यदि आप स्वयं द्वारा या छोटे तंग-बुनना टीम में विकसित कर रहे हैं, तो आप जो टूल चुनेंगे, वह अलग-अलग कौशल स्तरों वाले डेवलपर्स के साथ एक बड़ी कंपनी के लिए प्राप्त करने के लिए सबसे अच्छा नहीं हो सकता है। पठनीयता, उपयोग में आसानी और सादगी उत्तरार्द्ध मामले में अधिक विचार की आवश्यकता होगी। अंतिम नकली रूपरेखा प्राप्त करने में कोई समझदारी नहीं है अगर बहुत सारे लोग इसका उपयोग नहीं करते हैं या परीक्षण बनाए नहीं रखते हैं।
हम काम में EasyMock और EasyMock क्लास एक्सटेंशन का भारी उपयोग कर रहे हैं और इससे बहुत खुश हैं। यह मूल रूप से आपको वह सब कुछ देता है जिसकी आपको आवश्यकता है। प्रलेखन पर एक नज़र डालें, एक बहुत अच्छा उदाहरण है जो आपको ईज़ीमॉक की सभी विशेषताओं को दिखाता है।
मैंने JMock को जल्दी इस्तेमाल किया। मैंने अपने आखिरी प्रोजेक्ट में मॉकिटो की कोशिश की है और इसे पसंद किया है। अधिक संक्षिप्त, अधिक क्लीनर। पॉवरमॉक में मॉकिटो में अनुपस्थित सभी आवश्यकताओं को शामिल किया गया है, जैसे कि स्थैतिक कोड का मजाक उड़ाना, एक उदाहरण निर्माण का मजाक उड़ाना, अंतिम कक्षाओं और विधियों का मजाक उड़ाना। इसलिए मेरे पास अपना काम करने की जरूरत है।
मुझे JMock पसंद है क्योंकि आप उम्मीदों को स्थापित करने में सक्षम हैं। यह जाँचने से बिलकुल अलग है कि क्या कुछ मॉक लाइब्रेरी में कोई विधि पाई गई थी। JMock का उपयोग करके आप बहुत परिष्कृत अपेक्षाएं लिख सकते हैं। देख जम्मों चेट - छी ।
हां, मॉकिटो एक बेहतरीन ढांचा है। मैं अपने परीक्षण सेट करने के लिए हैमरेस्ट और Google guice के साथ इसका उपयोग करता हूं।
मॉकिंग का सबसे अच्छा समाधान यह है कि मशीन स्वचालित विनिर्देश-आधारित परीक्षण के साथ सभी काम करे। Java के लिए, ScalaCheck और कार्यात्मक जावा लाइब्रेरी में शामिल Reductio फ्रेमवर्क देखें । स्वचालित विनिर्देश-आधारित परीक्षण ढांचे के साथ, आप परीक्षण के तहत विधि का एक विनिर्देश (इसके बारे में एक संपत्ति जो सच होनी चाहिए) की आपूर्ति करते हैं और रूपरेखा स्वचालित रूप से परीक्षण के साथ-साथ नकली वस्तुओं को भी उत्पन्न करती है।
उदाहरण के लिए, निम्न गुण Math.sqrt विधि का परीक्षण करता है यह देखने के लिए कि क्या किसी धनात्मक संख्या n वर्ग का वर्गमूल n के बराबर है।
val propSqrt = forAll { (n: Int) => (n >= 0) ==> scala.Math.sqrt(n*n) == n }
जब आप कॉल करते हैं propSqrt.check()
, तो ScalaCheck सैकड़ों पूर्णांक बनाता है और प्रत्येक के लिए आपकी संपत्ति की जांच करता है, यह भी स्वचालित रूप से सुनिश्चित करता है कि किनारे के मामले अच्छी तरह से कवर किए गए हैं।
हालाँकि ScalaCheck को Scala में लिखा गया है, और इसके लिए Scala Compiler की आवश्यकता है, फिर भी इसके साथ Java कोड का परीक्षण करना आसान है। फंक्शनल जावा में रिडक्टियो फ्रेमवर्क समान अवधारणाओं का एक शुद्ध जावा कार्यान्वयन है।
मॉकिटो स्टबिंग मेथड, मैचिंग आर्गुमेंट्स (जैसे कोईइंट () और एनीस्ट्रिंग ()), इनवोकेशन की संख्या (बार (3), कम से कम), (कभी नहीं) ( और ) के विकल्प प्रदान करता है ।
मैंने यह भी पाया है कि मॉकिटो सरल और साफ है ।
एक बात जो मुझे मॉकिटो के बारे में पसंद नहीं है वह यह है कि आप स्टैटिक तरीकों को नहीं रोक सकते ।
कुछ अलग करने के लिए, आप JRuby और Mocha का उपयोग कर सकते हैं जो JestestR में संयुक्त रूप से अभिव्यंजक और रसीला रूबी में आपके जावा कोड के लिए परीक्षण लिखने के लिए उपयोग किए जाते हैं । JestestR के साथ कुछ उपयोगी नकली उदाहरण हैं । इस दृष्टिकोण का एक फायदा यह है कि ठोस वर्गों का मजाक उड़ाना बहुत सीधा है।
मैंने JMock के माध्यम से मोक्स का उपयोग करना शुरू कर दिया, लेकिन अंततः EasyMock का उपयोग करने के लिए संक्रमण किया। ईज़ीमॉक सिर्फ इतना ही था, --easier-- और एक सिंटैक्स प्रदान किया जो अधिक प्राकृतिक लगा। मैंने तब से स्विच नहीं किया है।