2016-12-05 8 views
6

के साथ नकली अंतिम श्रेणी मैं वर्तमान में काम कर रहे प्रोजेक्ट से Powermock को हटा रहा हूं, इसलिए मैं केवल कुछ मौजूदा एकता परीक्षण को मॉकिटो (मॉकिटो-कोर-2.2.28) के साथ फिर से लिखने की कोशिश कर रहा हूं।मॉकिटो 2

जब मैं परीक्षण चलाने के लिए, मैं निम्नलिखित त्रुटि है:

org.mockito.exceptions.base.MockitoException:

Cannot mock/spy class com.ExternalpackagePath.Externalclass

Mockito cannot mock/spy because :

  • final class

मुझे पता है कि इस सवाल का पहले से ही कहा गया है (How to mock a final class with mockito, Mock objects calling final classes static methods with Mockito), लेकिन मैं इस सवाल का जवाब मैं देख रहा हूँ नहीं मिला के लिये।

यहाँ मेरी कोड के एक उद्धरण है:

public class MyClassToTest extends TestCase { 
    private MyClass myClass; 
    @Mock private Externalclass ext; // This class is final, I would like to mock it 

    @Override 
    protected void setUp() throws Exception { 
     MockitoAnnotations.initMocks(this); // <<<< The exception is thrown here 
     ext = Mockito.mock(Externalclass.class); 
    } 
} 

Mockito दस्तावेज में उल्लेख किया है (https://github.com/mockito/mockito/wiki/What%27s-new-in-Mockito-2, §Mock unmockable), मैं org.mockito.plugins.MockMaker फ़ाइल जोड़ा। यह मेरा परियोजना के पेड़ है:

  • परियोजना
    • src
      • com.packagePath.myPackage
        • myClass
    • परीक्षण +०१२३५१६४१०६१
      • com.packagePath.myPackage
        • myClassToTest
      • संसाधनों
        • mockito-एक्सटेंशन
          • org.mockito.plugins.MockMaker

मैं भी "src" में "संसाधन" निर्देशिका डाल करने के लिए, एक subdir "परीक्षण" कहा जाता है में कोशिश करता है, लेकिन परिणाम अभी भी वही है।

मैंने सोचा कि मोकिटो वी 2 के साथ फाइनल का मज़ाक उड़ाया जा सकता था। क्या किसी को पता है कि यहां क्या गुम है?

धन्यवाद!

+0

फ़ाइल को org.mockito.plugins.MockMaker नाम दिया जाना चाहिए, org.mockito.plugins नहीं। –

+0

वूप्स, क्षमा करें, जब मैंने कॉपी/अतीत किया था, तो मैं लाइन के अंत को भूल गया था, फाइल का नाम मेरे मामले में अच्छी तरह लिखा गया है। मेरा बुरा! मैंने टेक्स्ट विवरण – Ptiseb

उत्तर

7

ठीक है, मैंने पाया कि यहां क्या गलत है, यह शायद अन्य लोगों के लिए उपयोगी हो सकता है। मेरा प्रोजेक्ट ट्री गलत है, मैंने org.mockito.plugins.MockMaker को "mockito-extension" निर्देशिका में सीधे "src" में रखा है।यह अब मेरे पेड़ है:

  • projet
    • src
      • com.packagePath.myPackage
        • myClass
      • mockito-एक्सटेंशन
        • org.mockito.plugins.MockMaker
  • परीक्षण
    • com.packagePath.myPackage
      • myClassToTest
+1

संपादित किया है, आपको अपने "मुख्य" स्रोत सेट में "मॉकमेकर" शामिल नहीं करना चाहिए। –

1

ऐसा लगता है कि मैंने क्लासपाथ मुद्दा किया है, जैसा मैंने किया था।

आपकी पिछली सेटअप भी काम किया होता, लेकिन ऐसा लगता है

तरह
project/test/resources 

अपने classpath में नहीं था।

जब मैं IntelliJ के साथ इसे चलाने की कोशिश करता था तो मुझे वही समस्या थी। मैंने बस संसाधन निर्देशिका को टेस्ट रिसोर्सेज रूट के रूप में चिह्नित किया और यह ठीक काम किया। मॉकिटो के देवताओं की स्तुति करो!

+0

यह मेरे लिए किया था! – breezymri

13

अजीब है कि आपका समाधान काम करता प्रतीत होता है।
Github पर उनके दस्तावेज़ों के अनुसार यह कहता है।

Mocking of final classes and methods is an incubating, opt-in feature. It uses a combination of Java agent instrumentation and subclassing in order to enable mockability of these types. As this works differently to our current mechanism and this one has different limitations and as we want to gather experience and user feedback, this feature had to be explicitly activated to be available ; it can be done via the mockito extension mechanism by creating the file src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker containing a single line:

mock-maker-inline 

After you created this file, Mockito will automatically use this new engine and one can do :

final class FinalClass { 
    final String finalMethod() { return "something"; } 
} 

FinalClass concrete = new FinalClass(); 

FinalClass mock = mock(FinalClass.class); 
given(mock.finalMethod()).willReturn("not anymore"); 

assertThat(mock.finalMethod()).isNotEqualTo(concrete.finalMethod()); 

In subsequent milestones, the team will bring a programmatic way of using this feature. We will identify and provide support for all unmockable scenarios. Stay tuned and please let us know what you think of this feature!

मेरी कामकाजी संरचना अब इस तरह दिखती है।

enter image description here

7

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

इसलिए, यदि आप Gradle उपयोग करें और अपनी Kotlin कोड का परीक्षण करना चाहते हैं, बस इस अपने प्रोजेक्ट की निर्भरता को जोड़ें: में

testCompile "org.mockito:mockito-android:2.9.0" 

की बजाय:

testCompile 'org.mockito:mockito-inline:2.8.9' 
testCompile('com.nhaarman:mockito-kotlin:1.5.0') { 
    exclude group: 'org.jetbrains.kotlin' 
    exclude group: 'org.mockito' 
} 
+0

इसे पोस्ट करने के लिए धन्यवाद। –

+0

इस मामले में समूह को बाहर करने का क्या अर्थ है? – rozina

+0

यह सुनिश्चित करता है कि आपके द्वारा संदर्भित इनलाइन संस्करण को 'मॉकिटो-कोटलिन' की पारगमन निर्भरता द्वारा ओवरराइड नहीं किया गया है जो यहां भी खींचा गया है। –

0

यह समाधान मेरे लिए काम किया ग्रेडल फ़ाइल, इसे

testCompile group: 'org.mockito', name: 'mockito-inline', version: '2.9.0' 

के साथ प्रतिस्थापित करें और यह काम करेगा।