2013-07-02 5 views
6

पर आउटऑफमेमरी एरर फेंकता है मैंने डेटाबेस पूल (केवल डेटा पुनर्प्राप्त करने के लिए) अनुकरण करने के लिए मॉकिटो का उपयोग करने का प्रयास किया, लेकिन एक प्रदर्शन परीक्षण चलाते समय, जिसने कई समय के दौरान कई नकली कनेक्शन पुनर्प्राप्त किए, यह स्मृति से बाहर हो गया।मॉकिटो एक साधारण परीक्षण

यहां एक सरलीकृत स्वयं निहित कोड है, जो मेरी मशीन पर लगभग 150,000 पाश पुनरावृत्तियों के बाद आउटऑफमेमरी एरर फेंकता है (इसके बावजूद कि कुछ भी वैश्विक रूप से सहेजा नहीं जा रहा है, और सब कुछ कचरा इकट्ठा होना चाहिए)। मैं क्या गलत कर रहा हूं? के लिए मुझे तो मैं सिर्फ तुम जब आप इसे चलाते heapspace उपलब्ध की राशि में वृद्धि करने की आवश्यकता है यह मान सकते हैं

import static org.mockito.Mockito.when; 

import java.sql.Connection; 

import org.mockito.Mock; 
import org.mockito.MockitoAnnotations; 

public class Test1 { 

    static class DbPool { 
     public Connection getConnection() {return null;} 
    } 

    @Mock 
    private DbPool dbPool; 

    @Mock 
    private Connection connection; 

    public Test1() { 
     MockitoAnnotations.initMocks(this); 
     when(dbPool.getConnection()).thenReturn(connection); 

     for(int i=0;i<1000000;i++) { 
      dbPool.getConnection(); 
      System.out.println(i); 
     } 
    } 

    public static void main(String s[]) {  
     new Test1(); 
    } 
} 
+0

उच्चतम मेरी स्मृति उपयोग कभी करने के लिए हो जाता है ~ 950 एमबी के रूप में [ 'रनटाइम द्वारा मापा है (। totalMemory'] (http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#totalMemory()))। – Jeffrey

+0

लेकिन इसे किसी भी स्मृति का उपयोग पहली जगह क्यों करना चाहिए? बनाए गए ऑब्जेक्ट्स के लिए कोई वैश्विक संदर्भ नहीं बनाया गया है, और फिर भी जब आप जीसी चलाते हैं तो कुछ भी एकत्र नहीं होता है। – Tim

+0

मॉकिटो अपने मजाकिया वर्गों के साथ दृश्यों के पीछे चीजें कर रहा है। मुझे लगता है कि वह जगह है जहां अधिकांश स्मृति का उपयोग किया जा रहा है। – Jeffrey

उत्तर

12

समस्या यह है कि नकली वस्तु प्रत्येक आमंत्रण के ब्योरे को याद कर रही है, अगर आप इसे बाद में सत्यापित करना चाहते हैं। आखिरकार, यह अनिवार्य रूप से स्मृति से बाहर हो जाएगा। आपको Mockito.reset स्थैतिक विधि का उपयोग करके, कभी-कभी नकली को रीसेट करने की आवश्यकता होती है, और फिर अपनी विधि को दबाएं। दुर्भाग्यवश, स्टबिंग को रीसेट किए बिना नकली की सत्यापन जानकारी को साफ़ करने का कोई तरीका नहीं है।

यह समस्या https://code.google.com/p/mockito/issues/detail?id=84

1

यह एक OutOfMemory त्रुटि फेंक नहीं किया। Here's how you can do that.

+0

मैंने अंतरिक्ष को 1 जीबी तक बढ़ा दिया, और जब मैं 1,000,000 पुनरावृत्तियों के बजाय 10,000,000 चलाता हूं, तब भी मुझे ओओएम मिलता है। समस्या यह है कि मॉकिटो में कहीं मेमोरी लीक लगती है। – Tim

12

डेविड-वालेस द्वारा प्रतिक्रिया में विस्तार से कवर किया जाता है यही कारण है कि आप एक OOM में चलाने: एक नकली वस्तु हर मंगलाचरण के विवरण को याद कर रहा है।

लेकिन एक समान रूप से महत्वपूर्ण सवाल यह है: अब इसके बारे में क्या करना है? क्या दाऊद को पहले से ही सुझाव के अलावा, नवीनतम Mockito संस्करणों के साथ-साथ 1.10.19 आगामी 2.0.x अब तथाकथित समर्थन stubOnly mocks (javadoc देखें):

stubOnly: एक ठूंठ-केवल नकली रिकॉर्ड नहीं करता है विधि invocations, इस प्रकार स्मृति की बचत लेकिन invocations के सत्यापन को अस्वीकार कर दिया।

स्काला के उपयोग का उदाहरण:

import org.mockito.Mockito 
val list = Mockito.mock(classOf[Foo], Mockito.withSettings().stubOnly()) 

// The syntax is a bit more concise when using ScalaTest's MockitoSugar 
val foo = mock[Foo](Mockito.withSettings().stubOnly()) 

जावा के उपयोग का उदाहरण (untested):

import org.mockito.Mockito; 
Foo mock = Mockito.mock(Foo.class, Mockito.withSettings().stubOnly());