java मजाक करते समय जूनियर में त्रुटि




unit-testing junit (2)

मैं जूनिट में नया हूँ, नीचे जूनिट कोड है जो मैं चल रहा हूं।

package com.de.base.util.general;
import static org.junit.Assert.*;
import static org.mockito.Mockito.when;
import java.util.HashMap;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.powermock.api.mockito.PowerMockito;

@RunWith(MockitoJUnitRunner.class)
public class JReportUtilTest {
@InjectMocks 
ReportUtil w_res = new ReportUtil();

@Mock
CollectionUtil w_util;

@Test
public void test_removeHashedSettings() throws Exception {
    HashMap<String ,String> w_abc = new HashMap<String,String>();
    w_abc.put("abc","89");
    //CollectionUtil mock = org.mockito.Mockito.mock(CollectionUtil.class);
    //PowerMockito.mockStatic(CollectionUtil.class,w_abc);          
    when(w_util.createHashMap("abc:89", ":")).thenReturn(w_abc);
    assertEquals("abc:89:",ReportUtil.removeHashedSettings("1", "abc:89", ":"));
}
}

यहां मेरी एपीआई हटाई गई हैशैटिंग सेटिंग्स रिपोर्ट रिपोर्ट

public static String removeHashedSettings(String key, String a_settings, String deilimiter) throws Exception
    {
        if (!(key != null && key.trim().length() > 0))
            return a_settings;
        if (!(a_settings != null && a_settings.trim().length() > 0))
            return a_settings;

        HashMap hSettings = CollectionUtil.createHashMap(a_settings, deilimiter);
        hSettings.remove(key);
        return getSettingFromHash(hSettings, deilimiter);
    }

नीचे संग्रह युग में हैशमैप बनाने के लिए कोड है जिसमें मुझे मॉक करना है।

public static HashMap<String, String> createHashMap(String a_NameValStr, String a_Delim)// throws Exception
    {
        HashMap<String, String> w_KeyVal = new HashMap<String, String>();
        if (LOGGER.isInfoEnabled()) LOGGER.info("CollectionUtil:createHashMap:Hashing string: "+ a_NameValStr );

        if(a_NameValStr == null) return w_KeyVal;

            StringTokenizer w_StrTkn = new StringTokenizer(a_NameValStr, a_Delim);
            if( w_StrTkn.countTokens() == 0 || (w_StrTkn.countTokens()%2) != 0 )
            {
                LOGGER.warn("CollectionUtil:createHashMap:Invalid number of tokens to hash: "+ a_NameValStr+":"+w_StrTkn.countTokens() );
                return w_KeyVal;
            }

            while (w_StrTkn.hasMoreTokens()) w_KeyVal.put( w_StrTkn.nextToken(), w_StrTkn.nextToken());
        System.out.println(w_KeyVal);   
        return w_KeyVal;
    }

मेरे जूनिट टेस्ट केस को चलते समय मुझे यह त्रुटि मिल रही है

 org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'.
For example:
    when(mock.getArticles()).thenReturn(articles);

Also, this error might show up because:
1. you stub either of: final/private/equals()/hashCode() methods.
   Those methods *cannot* be stubbed/verified.
   Mocking methods declared on non-public parent classes is not supported.
2. inside when() you don't call method on mock but on some other object.

    at com.de.base.util.general.JReportUtilTest.test_removeHashedSettings(JReportUtilTest.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37)
    at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

मैं mockito -all-1.10.19.jar का उपयोग कर रहा हूँ, पावरमॉक-अपी-मोकीटी -1.6.6.जर, पॉवमॉक-कोर-1.6.6.जेयर, पॉयरमॉक-मॉड्यूल-जूनि 4-4.6.6.जर कोई मेरी मदद कर सकता है इस समस्या के समाधान के लिये?


आप पावरमॉक धावक का उपयोग नहीं करते हैं:

@RunWith(PowerMockRunner.class)

Mockito स्थिर विधि का नकली नहीं कर सकता लेकिन PowerMock करता है

और आपको स्टैटिक मेथड के साथ क्लास का नकली होना चाहिए:

PowerMockito.mockStatic(CollectionUtil.class);

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

आपको ऐसे सहायक के रूप में स्थिर विधियों का उपयोग करना चाहिए जो डोमेन के मुख्य तर्क को निष्पादित नहीं करते हैं और उन्हें मजाक करने की आवश्यकता नहीं है

जब तरीके डोमेन के मुख्य तर्क को पूरा करते हैं, क्योंकि यह createHashMap() static method के मामले में है, तो आपको शायद परीक्षणों के दौरान आश्रित कक्षाओं के बीच साइड इफेक्ट नहीं बनाने के लिए इसे बहुत createHashMap() static method
और जैसा कि आपने देखा है: स्थैतिक तरीकों का मजाकिया वास्तव में बेढ़ंगे है क्योंकि स्थिर तरीके वास्तव में ओवरराइड होने के लिए डिज़ाइन नहीं किए गए हैं

इसके अलावा, डोमेन के मुख्य तर्क के लिए, आपको OOP (विरासत, बहुरूपता, डिजाइन पैटर्न, आदि ...) का लाभ उठाने की क्षमता होनी चाहिए, इसे स्थिर तरीके से कैसे प्राप्त करना चाहिए? -

विरासत कोड के लिए हम वास्तव में परिवर्तन नहीं कर सकते हैं, यह स्वीकार्य है लेकिन अन्यथा, यह नहीं है और आपको अपने कोड को रिफ़क्टर करना चाहिए।


यहां मेरा काम कोड है:

import static org.junit.Assert.assertEquals;

import java.util.HashMap;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(CollectionUtil.class)
public class TestHarnesTest {
    @InjectMocks
    TestHarnes w_res = new TestHarnes();

    @Before
    public void before() {
        PowerMockito.mockStatic(CollectionUtil.class);
    }

    @Test
    public void test_removeHashedSettings() throws Exception {
        HashMap<String, String> w_abc = new HashMap<String, String>();
        w_abc.put("abc", "89");
        // CollectionUtil mock = org.mockito.Mockito.mock(CollectionUtil.class);
        // PowerMockito.mockStatic(CollectionUtil.class,w_abc);
        PowerMockito.when(CollectionUtil.createHashMap(Mockito.eq("abc:89"), Mockito.eq(":"))).thenReturn(w_abc);
        assertEquals("abc:89:", TestHarnes.removeHashedSettings("1", "abc:89", ":"));
    }
}

और टेस्टहार्नस क्लास

public class TestHarnes {

    public static String removeHashedSettings(final String key, final String a_settings, final String deilimiter) throws Exception {
        if (!(key != null && key.trim().length() > 0)) {
            return a_settings;
        }
        if (!(a_settings != null && a_settings.trim().length() > 0)) {
            return a_settings;
        }

        HashMap hSettings = CollectionUtil.createHashMap(a_settings, deilimiter);
        hSettings.remove(key);
        return getSettingFromHash(hSettings, deilimiter);
    }

    private static String getSettingFromHash(final HashMap hSettings, final String deilimiter) {
        return "";
    }

}




powermock