2013-02-19 90 views
5

मेरे पास निम्न नमूना इकाई परीक्षण है जो java.nio.file.Files को मजाक करने का प्रयास करता है लेकिन यह मॉक काम नहीं करता है और कोड नमूना पथ को हटाने का प्रयास करता है।स्टेटिक मॉक काम नहीं कर रहा है

@Test 
    public void testPostVisitDirectory() throws Exception { 
     Path mockedPath = Paths.get("sample path"); 
     PowerMockito.mockStatic(Files.class); 
     PowerMockito.doNothing().when(Files.class, 
       PowerMockito.method(Files.class, "delete", Path.class)); 

     DeleteDirVisitor visitor = new DeleteDirVisitor(false); 
     Assert.assertEquals("The was a problem visiting the file", 
       FileVisitResult.CONTINUE, 
       visitor.postVisitDirectory(mockedPath, null)); 
    } 

कोई विचार गलत क्या है?

इस विधि की सामग्री visitor.postVisitDirectory

[...] 
if (e == null) { 
      Files.delete(dir); 
      return FileVisitResult.CONTINUE; 
     } 
[...] 

धन्यवाद है,

+0

BTW मैं एक NoSuchFileException हो रही है। – Stainedart

उत्तर

4

आप अपने JUnit परीक्षण वर्ग है कि विधि युक्त

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Files.class) 

चयन किया है?

powermock docs, लेखन परीक्षण अनुभाग देखें।

संपादित करें:

हममम, ऐसा लगता है आप सब कुछ ठीक कर रहे हैं लगता है। यहाँ मैं क्या चल रहा हूँ है:

import java.io.IOException; 
import java.nio.file.FileVisitResult; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.SimpleFileVisitor; 

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

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Files.class) 
public class TestVisitor { 
    public class PrintingVisitor extends SimpleFileVisitor<Path> { 
    @Override 
    public FileVisitResult postVisitDirectory(final Path dir, final IOException exc) throws IOException { 
     Files.delete(dir); 
     return FileVisitResult.CONTINUE; 
    } 
    } 

    @Test 
    public void testPostVisitDirectory() throws Exception { 
    final Path mockedPath = Paths.get("sample path"); 

    /* Mocking */ 
    PowerMockito.mockStatic(Files.class); 
    PowerMockito.doNothing().when(Files.class, PowerMockito.method(Files.class, "delete", Path.class)); 
    /* End Mocking */ 

    final PrintingVisitor visitor = new PrintingVisitor(); 
    Assert.assertEquals("The was a problem visiting the file", FileVisitResult.CONTINUE, visitor.postVisitDirectory(mockedPath, null)); 
    } 
} 

अगर मैं अनुभाग मजाक मैं NoSuchFileException मिल लेबल बाहर टिप्पणी। अगर मैं इसे छोड़ देता हूं, तो परीक्षण पास हो जाता है।

शायद पूरा उदाहरण पोस्ट करें जो त्रुटि उत्पन्न करता है?

+0

हां यह मौजूद है। एक ही कक्षा में मैं वास्तव में '' 'PowerMockito.stub ( \t \t \t \t PowerMockito.method (Files.class," deleteIfExists ", Path.class)) \t \t \t \t .toReturn (सही) एक ठूंठ है,' '' – Stainedart

+0

काम करता है लेकिन चूंकि डिलीट रिटर्न शून्य है, इसलिए मैं उसी तकनीक का उपयोग नहीं कर सकता :( – Stainedart

+0

मेरी समस्या मेरे मुकाबले ज्यादा जटिल हो सकती है। मैंने अलग-अलग वर्ग में सफलतापूर्वक अपना स्निपेट चलाया है लेकिन यह मेरी वर्तमान कक्षा में नहीं चलता है। टेस्ट क्लास स्तर पर गड़बड़ कर सकते हैं? – Stainedart

1

मुझे एक समान समस्या थी और यह पता चला कि यह सही कक्षाओं की तैयारी से संबंधित था।

परीक्षण की गई कक्षा के ऊपर उदाहरण में पहले से ही "तैयार करने के लिए स्कोप" था क्योंकि यह परीक्षण वर्ग का एक आंतरिक वर्ग था।

आपको कक्षाओं को @PrepareForTest पर जोड़ना है जो स्थिर विधियों को कॉल करते हैं ... और मेरे मामले में ये पर्याप्त नहीं था क्योंकि Files.delete तक पहुंचने वाला कोड अज्ञात वर्ग के अंदर था जिसे स्पष्ट रूप से तैयार नहीं किया जा सकता था।

मैं गुमनाम वर्ग नामित और @PrepareForTest में जोड़ा है और सब कुछ

+0

मैंने कक्षा को @PrepareForTest में जोड़ने का प्रयास किया लेकिन फिर नवीनतम जावासवादी में एक बग के कारण, एक स्टैकमैप त्रुटि में भाग गया: https://issues.jboss.org/browse/JASSIST-205 :-(। मजाक करने पर फिर से दिया गया फाइल वर्ग लेकिन टिप के लिए धन्यवाद! –

2

काम मैं powermock 1.5.1 और फ़ाइलें वर्ग का उपयोग कर एक ऐसी ही समस्या थी और संदेह है कि यह एक समस्या स्थिर कुछ/सभी jdk1.7 कक्षाएं मजाक है , हालांकि मुझे नहीं पता क्यों। मैंने जवासिस्ट संस्करण की भी जांच की और उस समय यह नवीनतम था (3.18.0-GA),

मैंने अपनी कक्षा को केवल फाइल लाइन पर परीक्षण के तहत छीन लिया और यह अभी भी काम नहीं कर पाया। मैंने फिर एक और स्थिर वर्ग, StringUtils.chop ("स्ट्रिंग") नकल करने का प्रयास करने का फैसला किया; (कॉमन्स-लैंग 3) और फिर मेरे पावरमेक परीक्षण ने काम किया और मैं इसे नकली से अपवाद उत्पन्न करने के लिए मजबूर करने में सक्षम था।

यह साबित हुआ कि मैंने पुस्तक द्वारा सबकुछ किया था और स्थिर मॉकिंग फाइल क्लास पर काम नहीं करती थी, लेकिन यह स्ट्रिंगयूटिल पर थी।

जिस तरह से मैंने बदल दिया, दोनों @PrepareForTest और PowerMockito.mockStatic() सही वर्ग का संदर्भ देने के लिए कहते हैं।

अंत में मैंने फ़ाइलों को मजाक कर दिया। अगर किसी और के पास एक ही समस्या है तो बस एक सिर-अप।

संपादित करें। यह काम कर रहा है: मैंने तब से यह कोशिश की है क्योंकि मुझे इसे किसी अन्य प्रोजेक्ट में चाहिए था। PowerMock आउट (1.5.3) का एक नया संस्करण है जो एक अद्यतन जैवसिस्ट (3.18.1-GA) का उपयोग करता है जो किसी अन्य टिप्पणी के प्रति मेरी प्रतिक्रिया में उल्लिखित एक बग को हल करता है।

मैं लगातार अब भी वर्ग यदि आप परीक्षण स्थिर तरीकों का खुलासा नहीं करता हैं @PrepareForTest के साथ-साथ Files को परीक्षण के अंतर्गत वर्ग जोड़कर काम करने के लिए Files का मजाक हो सकता है। मुझे अन्य स्थैतिक मजाक करने के लिए पहले ऐसा करने की आवश्यकता नहीं थी। मुझे नहीं पता कि इसकी आवश्यकता क्यों है या Files के लिए अलग-अलग काम करता है।

उदाहरण:

public class MyTestClass { 

    public void justToTestMocking(Path path) throws IOException { 
     if (!Files.exists(path)) { 
      throw new IllegalArgumentException("I know there is a deleteIfExists() but I am just testing mocking"); 
     } 
     Files.delete(path); 
    } 
} 

और नीचे परीक्षण:

@RunWith(PowerMockRunner.class) 
@PrepareForTest({Files.class, MyTestClass.class}) 
public class MyTestClassTest { 

    @Before 
    public void setUp() { 
     mockStatic(Files.class); 

    }   

    @Test 
    public void justToTestMocking_WillDeletePath() throws IOException { 
     Path path = mock(Path.class); 
     MyTestClass test = new MyTestClass(); 

     when(Files.exists(path)).thenReturn(true); 

     test.justToTestMocking(path); 

     verifyStatic(); 
     Files.delete(path); 
    } 
}