2015-09-26 7 views
9

एक वर्ग Foo कि निर्माता में Bar को बीच में रोक और फिर Bar के मामले में toString() लागू करता है की निम्न नमूना MockUp पर विचार करें;क्या JMockit MockUp mock toString() कर सकते हैं?

public class FooStub extends MockUp<Foo> { 

    private Bar bar; 

    @Mock 
    public void $init(Bar bar) { 
     this.bar = bar; 
    } 

    @Mock 
    public String toString() { 
     return bar.toString(); 
    } 
} 

FootoString() ओवरराइड करने के लिए सभी ठीक काम करता है यदि ऐसा होता है। अन्यथा, आपको IllegalArgumentException मिलता है: "निम्नलिखित मॉक्स के लिए वास्तविक तरीकों को मिलान नहीं किया जा रहा है"। मैं यहां से समझता हूं कि जेमॉकिट बेस क्लास में नहीं दिखता है और इसलिए नकली करने के लिए toString() विधि नहीं मिल सकती है।

मान लीजिए कि मैं फू क्लास को संशोधित नहीं कर सकता (वास्तव में मैं कर सकता हूं, लेकिन सिर्फ तर्क के लिए), क्या toString() को इस Foo कक्षा के लिए नकल करने का कोई तरीका है?

स्पष्ट होने के लिए, मैं इस वर्ग के सभी उदाहरणों को नकल करना चाहता हूं, न केवल एक उदाहरण (जिसमें आसान समाधान हैं जिन्हें MockUp की आवश्यकता नहीं है)।

+2

[जेमॉकिट का संभावित डुप्लिकेट: net.android.Uri क्लास के स्ट्रिंग के लिए विधि का नकल नहीं कर सकता] (https://stackoverflow.com/questions/41561351/jmockit-cant-mock-method-tostring-of-net- android-uri वर्ग) – Jotunacorn

उत्तर

0

JMockit सभी सुपर वर्गों, लेकिनjava.lang.Object को छोड़कर ऊपर वर्ग पदानुक्रम नकली होगा।

private final class Baz extends Bar { 
    @Override 
    public String toString() { 
     return super.toString(); 
    } 
} 

अब बस आपको अपने नकली में क्या करना है Baz के माध्यम से सौंपने के लिए है:

आप अपने परीक्षण है जो toString() जो super.toString() फोन करके Bar के toString() प्रतिनिधियों अधिभावी द्वारा Bar फैली में private final वर्ग को परिभाषित कर सकता है Bar नहीं।

इस तरह आप toString() की ठोस अभी तक पारदर्शी कार्यान्वयन जो आप Bar वर्ग जिसके कारण आपके नियंत्रण से बाहर है बिना छुए नकली कर सकते हैं मिल गया।

संबंधित मुद्दे