जावा के लिए सबसे अच्छा नकली ढांचा क्या है? [बन्द है]


347

जावा में नकली वस्तुएं बनाने के लिए सबसे अच्छा ढांचा क्या है? क्यों? प्रत्येक रूपरेखा के पेशेवरों और विपक्ष क्या हैं?

जवाबों:


315

मुझे मॉकिटो का उपयोग करके अच्छी सफलता मिली है ।

जब मैंने JMock और EasyMock के बारे में जानने की कोशिश की, तो मैंने सीखने की अवस्था को थोड़ा स्थिर पाया (हालाँकि शायद यह सिर्फ मेरे लिए है)।

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

यहाँ मॉकिटो मुखपृष्ठ से (संक्षिप्त) उदाहरण दिया गया है:

import static org.mockito.Mockito.*;

List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();

यह उससे ज्यादा सरल नहीं है।

केवल मुख्य नकारात्मक पक्ष मैं यह सोच सकता हूं कि यह स्थैतिक तरीकों का मजाक नहीं उड़ाएगा।


15
सुंदर। स्थैतिक तरीकों के लिए, बस मॉकिटो को जेमॉकिट के साथ मिलाएं और व्यावहारिक रूप से कोई भी वर्ग "विरासत" आपके लिए परीक्षण करने में सक्षम नहीं होगा।
एपाग

6
मुझे पसंद है कि जब आप कुछ ऐसा करने की कोशिश करते हैं जो आपको नहीं करना चाहिए (जैसे कि नकली इनलाइन बनाना), तो आपको अपवाद संदेश में आपने जो गलत किया, उसकी बहुत स्पष्ट व्याख्या मिलती है।
ripper234

3
मेरे लिए, बिल्कुल। मैं अब भी बिना शर्त सिफारिश करूंगा। बेशक, अगर आपको एक और ढांचा मिल जाए जो आपकी आवश्यकताओं को बेहतर ढंग से पूरा करता है, तो इसे दूसरे उत्तर में उल्लेख करें और देखें कि इसे क्या वोट मिलता है और इसे किस प्रकार की टिप्पणियां मिलती हैं।
बजे ब्रायन लाफरामोबिस

2
@MexicanHacker आप Android के लिए इसका उपयोग क्यों नहीं कर सके? मैं इसे अभी उपयोग कर रहा हूं, रोबोइलेक्ट्रिक के साथ।
इल्का

2
मैं Mockito का उपयोग कर रहा हूँ और इसे प्यार करता हूँ !! महान प्रलेखन भी (इस गुणवत्ता के प्रलेखन को खोजने के लिए बहुत दुर्लभ है, लेखकों से अच्छा काम), जो हमारे लिए फ्रेमवर्क कोड में खोदने के बिना सामान का उपयोग करना बहुत महत्वपूर्ण है !!!
रेनाटो

84

मैं PowerMock का निर्माता हूं, तो जाहिर है मुझे इसकी सिफारिश करनी चाहिए! :-)

PowerMock, EasyMock और Mockito दोनों को स्थिर विधियों , अंतिम और यहां तक ​​कि निजी विधियों की नकल करने की क्षमता तक बढ़ाता है । ईज़ीमॉक सपोर्ट पूरा हो गया है, लेकिन मॉकिटो प्लगइन को कुछ और काम करने की ज़रूरत है। हम JMock समर्थन को भी जोड़ने की योजना बना रहे हैं।

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


पोवर्म यूनिट के परीक्षण के लिए आवश्यक है मेजबान पीसी पर देशी जावा का उपयोग करके एंड्रॉइड एप्लिकेशन (धीमी इम्यूलेटर का उपयोग करने से बचना)
जेफ एक्सलरोड

@ केवल मुद्दा PowerMock रोबोइलेक्ट्रिक का उपयोग करते समय असंगत है, हालांकि-( मैं करना चाहता हूं @RunWith (PowerMockRunner.class) और @RunWith (RobolectricTestRunner .class)
ब्लंडेल

पिछले कुछ महीनों से PowerMock का उपयोग करने के बाद मैं इसे दिल से सुझाता हूं!
cwash

पावरमॉक वाकई कमाल का है। मुझे वास्तव में सब कुछ एक्सेस करने के लिए स्टैटिक सिंगललेट्स से प्यार है, और यह परीक्षण करना संभव बनाता है।
इयान मैकलिनाओ

कैविएट: अंतिम तरीके की नकल करने जैसी कुछ चीजें केवल पावरमॉक में ईजीमॉक के लिए संभव हैं और मॉकिटो के लिए नहीं। जब आप इसे बार-बार उपयोग नहीं करते हैं, तो यह थोड़ा सा हो गया है। मैं सोच रहा था कि कुछ काम क्यों नहीं कर रहा था, तब मुझे एहसास हुआ कि यह केवल डोकोमो के ईजीमॉक सेक्शन के तहत सूचीबद्ध है।
२३:०४ पर ट्रैफालडोरियन

46

JMockit परियोजना स्थल वर्तमान मजाक उपकरणकिटें के लिए तुलनात्मक जानकारी के बहुत सारे हैं।

विशेष रूप से, सुविधा तुलना मैट्रिक्स की जांच करें , जिसमें ईज़ीमॉक, जेमॉक, मॉकिटो, यूनिट्स मॉक, पावरमॉक और निश्चित रूप से जेमॉकिट शामिल हैं। मैं इसे यथासंभव सटीक और अद्यतित रखने की कोशिश करता हूं।


1
मैं JMockit से प्रभावित हूं, इसमें एक स्टेटर लर्निंग कर्व है, लेकिन इसके पास सालों से बहुत अच्छे डॉक्यूमेंटेशन हैं, और यह किसी भी चीज का मजाक उड़ा सकता है। मैंने मॉकिटो के साथ शुरुआत की, जो सीखना आसान था, लेकिन मैं नियमित रूप से उन समस्याओं से मिलता था, जिन्हें मैं हल नहीं कर सकता था। दूसरी ओर मैं सोच भी नहीं सकता कि जेमॉकिट के साथ क्या असंभव है।
हंट्वरी लेवेंटे

21

मुझे 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 की आवश्यकता होती है।


हां, वास्तव में यह सिफारिश कर सकते हैं
एपागा

7
बस एक अपडेट: JMockit प्रोजेक्ट को code.google.com/p/jmockit पर ले जाया गया । यह इस पद के बाद से एक बहुत विकसित हुआ है (और अभी भी विकसित हो रहा है), और अब इसका व्यापक प्रलेखन है।
रोजेरियो डेस

JMockit फिर से चला गया है। यह अब Github पर उपलब्ध है। jmockit.github.io
रवि थपलियाल

15

तुम भी Groovy का उपयोग कर परीक्षण पर एक नज़र हो सकता है। Groovy में आप आसानी से 'के रूप में' ऑपरेटर का उपयोग करके जावा इंटरफेस का मज़ाक उड़ा सकते हैं:

def request = [isUserInRole: { roleName -> roleName == "testRole"}] as HttpServletRequest 

इस बुनियादी कार्यक्षमता के अलावा ग्रूवी शक्तिशाली MockForऔर StubForकक्षाओं सहित मोर्चे पर बहुत अधिक प्रदान करता है ।

http://docs.codehaus.org/display/GROOVY/Groovy+Mocks


13

मैंने EasyMock के साथ मोक्स का उपयोग करना शुरू कर दिया । समझने में काफी आसान है, लेकिन रिप्ले स्टेप थोड़े कष्टप्रद था। मॉकिटो इसे हटाता है, इसमें एक क्लीनर सिंटैक्स भी है क्योंकि ऐसा लगता है कि पठनीयता इसके प्राथमिक लक्ष्यों में से एक थी। मैं इस बात पर जोर नहीं दे सकता कि यह कितना महत्वपूर्ण है, क्योंकि अधिकांश डेवलपर्स अपना समय पढ़ने और मौजूदा कोड को बनाए रखने, इसे बनाने में नहीं बिताएंगे।

एक और अच्छी बात यह है कि ईज़ीमॉक के विपरीत इंटरफेस और इंप्लीमेंटेशन क्लास को एक ही तरह से हैंडल किया जाता है, जहाँ अभी भी आपको ईज़ीमॉक क्लास एक्सटेंशन का उपयोग करने के लिए याद रखना (और जांचना) आवश्यक है।

मैंने JMockit पर एक त्वरित नज़र डाली है हाल ही , और जबकि सुविधाओं की कपड़े धोने की सूची बहुत व्यापक है, मुझे लगता है कि इस की कीमत परिणामी कोड की विरासत है, और अधिक लिखने के लिए।

मेरे लिए, मॉकिटो मीठा स्थान हिट करता है, लिखना और पढ़ना आसान है, और अधिकांश परिस्थितियों से निपटने के लिए अधिकांश कोड की आवश्यकता होगी। का उपयोग करते हुए Mockito साथ PowerMock मेरी पसंद होगा।

विचार करने के लिए एक बात यह है कि यदि आप स्वयं द्वारा या छोटे तंग-बुनना टीम में विकसित कर रहे हैं, तो आप जो टूल चुनेंगे, वह अलग-अलग कौशल स्तरों वाले डेवलपर्स के साथ एक बड़ी कंपनी के लिए प्राप्त करने के लिए सबसे अच्छा नहीं हो सकता है। पठनीयता, उपयोग में आसानी और सादगी उत्तरार्द्ध मामले में अधिक विचार की आवश्यकता होगी। अंतिम नकली रूपरेखा प्राप्त करने में कोई समझदारी नहीं है अगर बहुत सारे लोग इसका उपयोग नहीं करते हैं या परीक्षण बनाए नहीं रखते हैं।


1
+1 इस उत्तर को और अधिक बढ़ाने की आवश्यकता है। एक को साझा करना चाहिए कि उन्हें वास्तव में क्या पसंद आया या क्या नहीं। बस "मैंने इसका इस्तेमाल किया .. और मुझे यह पसंद आया!" ऐसे कारणों में से एक है कि ऐसे अच्छे प्रश्न SO पर बंद हो जाते हैं।
रवि थपलियाल

11

हम काम में EasyMock और EasyMock क्लास एक्सटेंशन का भारी उपयोग कर रहे हैं और इससे बहुत खुश हैं। यह मूल रूप से आपको वह सब कुछ देता है जिसकी आपको आवश्यकता है। प्रलेखन पर एक नज़र डालें, एक बहुत अच्छा उदाहरण है जो आपको ईज़ीमॉक की सभी विशेषताओं को दिखाता है।


1
मेरे प्रश्न में, मैं आपको एक मॉक फ्रेमवर्क के बारे में अधिक पसंद और नापसंद कर रहा था। मैं प्रलेखन पा सकता हूं और इसके बारे में सब कुछ पढ़ सकता हूं - मैं जानना चाहता हूं कि जिन लोगों ने इसका उपयोग किया है वे इसके बारे में क्या सोचते हैं।
जोश ब्राउन

EasyMock केवल जावा 5 और इसके बाद के संस्करण पर काम करता है, argh!
मैट बी

8

मैंने JMock को जल्दी इस्तेमाल किया। मैंने अपने आखिरी प्रोजेक्ट में मॉकिटो की कोशिश की है और इसे पसंद किया है। अधिक संक्षिप्त, अधिक क्लीनर। पॉवरमॉक में मॉकिटो में अनुपस्थित सभी आवश्यकताओं को शामिल किया गया है, जैसे कि स्थैतिक कोड का मजाक उड़ाना, एक उदाहरण निर्माण का मजाक उड़ाना, अंतिम कक्षाओं और विधियों का मजाक उड़ाना। इसलिए मेरे पास अपना काम करने की जरूरत है।


6

मुझे JMock पसंद है क्योंकि आप उम्मीदों को स्थापित करने में सक्षम हैं। यह जाँचने से बिलकुल अलग है कि क्या कुछ मॉक लाइब्रेरी में कोई विधि पाई गई थी। JMock का उपयोग करके आप बहुत परिष्कृत अपेक्षाएं लिख सकते हैं। देख जम्मों चेट - छी ।



4

मॉकिंग का सबसे अच्छा समाधान यह है कि मशीन स्वचालित विनिर्देश-आधारित परीक्षण के साथ सभी काम करे। 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

मॉकिटो स्टबिंग मेथड, मैचिंग आर्गुमेंट्स (जैसे कोईइंट () और एनीस्ट्रिंग ()), इनवोकेशन की संख्या (बार (3), कम से कम), (कभी नहीं) ( और ) के विकल्प प्रदान करता है

मैंने यह भी पाया है कि मॉकिटो सरल और साफ है

एक बात जो मुझे मॉकिटो के बारे में पसंद नहीं है वह यह है कि आप स्टैटिक तरीकों को नहीं रोक सकते


यह उत्तर गलत है। आप jMock के साथ इंटरफेस तक सीमित नहीं हैं। आप ClassImposteriser के साथ ठोस कक्षाओं का मजाक उड़ा सकते हैं।
टेफ्लॉन टेड

आप EasyMock के साथ भी ठीक वैसा ही काम कर सकते हैं।
केम कैटिक्कास

मैंने अपने उत्तर से गलतियाँ निकाल दी हैं।
जोश ब्राउन

2

कुछ अलग करने के लिए, आप JRuby और Mocha का उपयोग कर सकते हैं जो JestestR में संयुक्त रूप से अभिव्यंजक और रसीला रूबी में आपके जावा कोड के लिए परीक्षण लिखने के लिए उपयोग किए जाते हैं । JestestR के साथ कुछ उपयोगी नकली उदाहरण हैं । इस दृष्टिकोण का एक फायदा यह है कि ठोस वर्गों का मजाक उड़ाना बहुत सीधा है।


1

मैंने JMock के माध्यम से मोक्स का उपयोग करना शुरू कर दिया, लेकिन अंततः EasyMock का उपयोग करने के लिए संक्रमण किया। ईज़ीमॉक सिर्फ इतना ही था, --easier-- और एक सिंटैक्स प्रदान किया जो अधिक प्राकृतिक लगा। मैंने तब से स्विच नहीं किया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.