2012-04-19 12 views
9

मैं साधारण परीक्षण मामला है: मैं परीक्षण मैं हो रही शुरू करते हैं तबMockito - देशी तरीकों के साथ मजाक कक्षाएं

public final native TableRowElement insertRow(int index); 

:

@Test 
public void test() throws Exception{ 
     TableElement table = mock(TableElement.class); 
     table.insertRow(0); 
} 

कहाँ TableElement विधि insertRow साथ GWT वर्ग है के रूप में परिभाषित:

java.lang.UnsatisfiedLinkError: com.google.gwt.dom.client.TableElement.insertRow(I)Lcom/google/gwt/dom/client/TableRowElement; 
    at com.google.gwt.dom.client.TableElement.insertRow(Native Method) 

के रूप में मेरा मानना ​​है कि कौन सा insertRow विधि देशी होने के साथ संबंधित है। क्या मॉकिटो के साथ ऐसी विधियों का नकल करने का कोई तरीका या कामकाज है?

उत्तर

11

Mockito ही इस Google Group thread के अनुसार देशी तरीकों उपहास करने के लिए सक्षम होने के लिए प्रतीत नहीं होता। हालांकि आपके पास दो विकल्प हैं:

  1. लपेटें एक अंतरफलक में TableElement वर्ग और है कि इंटरफ़ेस नकली ठीक से परीक्षण करने के लिए है कि अपने SUT कॉल लिपटे insertRow(...) विधि। दोष यह अतिरिक्त इंटरफ़ेस है कि आप जोड़ने के लिए (जब GWT परियोजना अपने स्वयं के एपीआई में यह कर दिया है चाहिए) और भूमि के ऊपर इसका इस्तेमाल करने की जरूरत है। इंटरफेस और ठोस कार्यान्वयन के लिए कोड इस तरह दिखेगा:

    // the mockable interface 
    public interface ITableElementWrapper { 
        public void insertRow(int index); 
    } 
    
    // the concrete implementation that you'll be using 
    public class TableElementWrapper implements ITableElementWrapper { 
        TableElement wrapped; 
    
        public TableElementWrapper(TableElement te) { 
         this.wrapped = te; 
        } 
    
        public void insertRow(int index) { 
         wrapped.insertRow(index); 
        } 
    } 
    
    // the factory that your SUT should be injected with and be 
    // using to wrap the table element with 
    public interface IGwtWrapperFactory { 
        public ITableElementWrapper wrap(TableElement te); 
    } 
    
    public class GwtWrapperFactory implements IGwtWrapperFactory { 
        public ITableElementWrapper wrap(TableElement te) { 
         return new TableElementWrapper(te); 
        } 
    } 
    
  2. उपयोग Powermock और यह Mockito API extensionPowerMockito बुलाया देशी विधि उपहास करने के लिए है। दोष यह है कि आप अपने परीक्षण परियोजना में लोड करने के लिए एक और निर्भरता (मुझे पता है इस प्रयोग की जाने वाली कुछ संगठनों जहां एक 3 पार्टी पुस्तकालय क्रम में पहले का लेखा परीक्षण किया गया है के साथ एक समस्या हो सकती हूँ) है।

व्यक्तिगत रूप से मैं विकल्प 2 के साथ जाऊंगा, क्योंकि जीडब्ल्यूटी परियोजना इंटरफेस में अपनी कक्षाएं लपेटने की संभावना नहीं है (और अधिक संभावना है कि उनके पास अधिक देशी विधियां हैं जिन्हें मजाक करने की आवश्यकता है) और इसे अपने लिए करना केवल मूल विधि कॉल को लपेटने के लिए बस आपके समय का अपशिष्ट है।

+0

दुर्भाग्य से मैं 'अधिक TableElement' वर्ग कोई नियंत्रण नहीं की कोशिश करो - यह बाह्य पुस्तकालय के अंतर्गत आता है। हालांकि Powermock Mockito API एक्सटेंशन बहुत दिलचस्प लग रहा है, मैं इसे देख लूंगा। –

+0

जब आप किसी और की सामग्री लपेटते हैं तो ** आपके पास नियंत्रण होता है। :-) कि रैपर की सुंदरता है, [एडेप्टर] (http://en.wikipedia.org/wiki/Adapter_pattern), या [façades] (http://en.wikipedia.org/wiki/Facade_pattern)। – Spoike

+0

बहुत अच्छा और विस्तृत उत्तर के लिए बहुत बहुत धन्यवाद। रैपिंग काम करेंगे और मैं एक अंतिम उपाय के रूप में उपयोग कर सकते हैं, लेकिन मेरे स्वाद के लिए यह बहुत ज्यादा झुकाव और केवल परीक्षण उद्देश्यों :(। –

0

किसी और मामले किसी को भी इस बारे में लड़खड़ाती है: इस बीच में (May 2013 में) GwtMockito कर दिया है, जो PowerMock की भूमि के ऊपर के बिना इस समस्या का हल।

इस

@RunWith(GwtMockitoTestRunner.class) 
public class MyTest { 

    @Test 
    public void test() throws Exception{ 
     TableElement table = mock(TableElement.class); 
     table.insertRow(0); 
    } 
} 
संबंधित मुद्दे