2013-07-30 8 views
5

काम नहीं कर रहा है। मैं यह सत्यापित करने की कोशिश कर रहा हूं कि संग्रह। शफल() विधि को मेरी कक्षाओं में से एक में बुलाया गया था। मैंने मॉकिटो के साथ पावरमैक पर (छोटे) दस्तावेज के माध्यम से पढ़ा और अन्य मुद्दों के माध्यम से पढ़ा जो इस मुद्दे से निपटाए और एक संकल्प नहीं मिला।पावरमोक और मॉकिटो के साथ स्टेटिक मॉकिंग

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Collections.class) 
public class MyTest { 

    @Test 
    public void testShuffle() { 
     PowerMockito.mockStatic(Collections.class); 
     PowerMockito.doCallRealMethod().when(Collections.class); 
     Collections.shuffle(Mockito.anyListOf(Something.class)); 

     ClassToTest test = new ClassToTest(); 
     test.doSomething(); 

     PowerMockito.verifyStatic(); // Verify shuffle was called exactly once 
     Collections.shuffle(Mockito.anyListOf(Something.class)); 
    } 
} 

public class ClassToTest { 
    private final List<Something> list; 
    // ... 
    public void doSomething() { 
     Collections.shuffle(list); 
     // do more stuff 
    } 
} 

उपरोक्त कोड को देखते हुए, मैं इकाई परीक्षण पास की अपेक्षा करता हूं। हालांकि, इकाई परीक्षण निम्नानुसार विफल रहता है:

Wanted but not invoked java.util.Collections.shuffle([]); 
Actually, there were zero interactions with this mock. 

मैं क्या गलत कर रहा हूं?

धन्यवाद

संपादित करें: सुझाव नीचे मैं निम्नलिखित की कोशिश की, और मैं एक ही त्रुटि मिलती है के अनुसार।

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Collections.class) 
public class MyTest { 

    @Test 
    public void testShuffle() { 
     PowerMockito.mockStatic(Collections.class); 

     ClassToTest test = new ClassToTest(); 
     test.doSomething(); 

     PowerMockito.verifyStatic(); // Verify shuffle was called exactly once 
     Collections.shuffle(Mockito.anyListOf(Something.class)); 
    } 
} 
+0

क्या होता है यदि आप अपने matcher पर 'anyListOf' से' किसी भी (List.class) 'पर प्रतिबंध को ढीला करते हैं? क्या होता है यदि आप '@ PrepareForTest' एनोटेशन में 'ClassToTest' जोड़ते हैं? –

उत्तर

4

आप या तो नकली/सत्यापित java.util.Collections.shuffle ([]) विधि या वास्तविक कार्यान्वयन फोन (PowerMockito.doCallRealMethod साथ())। लेकिन आप दोनों नहीं कर सकते हैं।

आप

PowerMockito.doCallRealMethod().when(Collections.class); 

निकाल देते हैं तो कॉल सत्यापित किया जाएगा और परीक्षा उत्तीर्ण होंगे।

https://powermock.googlecode.com/svn/docs/powermock-1.4.7/apidocs/org/powermock/api/mockito/PowerMockito.html#doCallRealMethod%28%29

इस कोड मेरे लिए काम करता है:

package test; 

import java.util.Collections; 
import java.util.LinkedList; 
import java.util.List; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
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(Collections.class) 
public class MyTest { 

    @Test 
    public void testShuffle() { 
     PowerMockito.mockStatic(Collections.class); 
/*  PowerMockito.doCallRealMethod().when(Collections.class); remove this line */ 
     Collections.shuffle(Mockito.anyListOf(Something.class)); 

     ClassToTest test = new ClassToTest(); 
     test.doSomething(); 

     PowerMockito.verifyStatic(); // Verify shuffle was called exactly once 
     Collections.shuffle(Mockito.anyListOf(Something.class)); 
    } 
} 

class ClassToTest { 
    private List<Something> list = new LinkedList<Something>(); 
    // ... 
    public void doSomething() { 
     Collections.shuffle(list); 
     // do more stuff 
    } 
} 
class Something { 
} 
+0

मैंने आपके द्वारा सुझाए गए प्रयासों की कोशिश की, और मेरा परीक्षण अभी भी यह कहने में असफल रहा कि नकली के साथ शून्य इंटरैक्शन थे। मेरा संपादन देखें। –

+0

आह धन्यवाद ... मुझे वह हिस्सा याद आया जहां मुझे संग्रह। शफल() को फोन करना है ... हालांकि मैं शपथ ले सकता था कि मैंने भी कोशिश की। –

4

यह एक नहीं बल्कि पुराने सवाल है, लेकिन मैं अभी भी स्पष्ट किया है कि स्वीकार किए जाते हैं जवाब इस तथ्य गलत में है या नहीं। निम्नलिखित कोड को क्रियान्वित करके,

PowerMockito.mockStatic(Collections.class); 
Collections.shuffle(Mockito.anyListOf(Something.class)); 

सब सत्यापन हमेशा बाद में पारित करेंगे:

PowerMockito.verifyStatic(); // Verify shuffle was called exactly once 
Collections.shuffle(Mockito.anyListOf(Something.class)); 

भले ही आप test.doSomething(); जवाब में प्रदान की जाती परीक्षण अभी भी पारित करेंगे न बुलाया जाए। इसका परीक्षण करने का सही तरीका वास्तव में यह जांचना है कि सूची में आइटम सही ढंग से क्रमबद्ध किए गए हैं या नहीं।

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