2012-02-17 12 views
9

परीक्षण करने के बिना मैं जावा में आउटपुट स्ट्रीम का परीक्षण कर रहा हूं।आउटपुटस्ट्रीम.write (<String>) कोई फ़ाइल बनाने के बिना

Writer outputStream = getOutputStream(fileName); 
    if(outputStream != null) { 
     try { 
      outputStream.write(inputText); 
     } 
     finally { 
      outputStream.close(); 
     } 
    } 
    else { 
     throw new IOException("Output stream is null"); 
    } 

मैं

public void testFileWrite() throws IOException { 
    when(testObj.getOutputStream(outputFileNameValidValue)).thenReturn(outputStreamMock); 
    doNothing().when(outputStreamMock).write(Matchers.anyString()); 
    doNothing().when(bufferedReaderMock).close(); 

    testObj.write(outputFileNameValidValue, reveredFileInput); 

    verify(outputStreamMock).write(Matchers.anyString()); 
    verify(outputStreamMock).close(); 
} 

नीचे के रूप में एक mockito परीक्षण लिखने समस्या यह है कि जब आप OutputStreamWriter(new FileOutputStream(filename)) बनाने डिस्क पर एक भौतिक फ़ाइल बनाई गई है हूँ।

क्या हम डिस्क पर फ़ाइल लिखने के बिना Outputstream.write का परीक्षण कर सकते हैं?

धन्यवाद आनंद

+1

स्पष्ट करें:

मैं तुम्हारे लिए इस कोड को जो पूरी तरह से निहित आत्म है। मुझे लगता है कि यह 'getOutputStream' के भीतर है - सिवाय इसके कि आपने इस विधि को दबा दिया है। यदि आप चाहते हैं कि लोग आपकी मदद करने का अच्छा काम करें तो आपको अपना पूरा कोड पोस्ट करना होगा। साथ ही, 'getOutputStream' को शायद कुछ और कहा जाना चाहिए (शायद' makeWriter'), क्योंकि इसे 'आउटपुटस्ट्रीम' नहीं मिलता है। –

+0

getOutputStream विधि में। कारण यह है कि मैं इसे उम्मीद के साथ विधि में ले गया कि मॉकिटो mthod नहीं चलाएगा और नकली वापस नहीं करेगा। लेकिन मैं गलत हूँ। – Anand

+0

कुछ दस्तावेज़ों को गुगलने और पढ़ने के बाद पता चला कि पावरमैक इसे आसानी से कर सकता है। उम्मीद के साथ नया या suppressConstructor और Whitebox.setInsternalState का उपयोग कर। PowerMock के साथ ऐसी चीजों का परीक्षण करना कहीं आसान है। आपकी टिप्पणियों और उत्तरों के लिए धन्यवाद।सम्मान, आनंद बारहेट – Anand

उत्तर

9

आप ByteArrayOutputStream जो स्मृति में डेटा लिखते हैं उपयोग कर सकते हैं। आप इसे एक ByteArrayInputStream के साथ पढ़ सकते हैं।

एक विकल्प आउटपुटस्ट्रीम की अपेक्षा करना एक विकल्प है जो आप गलत बाइट लिखने की कोशिश करते हैं। यह देखने में सहायक हो सकता है कि वास्तव में कहां/क्यों विफल रहता है।

+0

ठीक है .. तो लिखने के लिए बाइटएरेऑटपुटस्ट्रीम का उपयोग करें और फिर अंततः मुझे फ़ाइल लिखने के लिए लिखना होगा? लेकिन जल्दी या बाद में मुझे एक ही समस्या का सामना करना पड़ेगा, है ना? XXStreamWriter को फ़ाइल लिखनी होगी और यही वह है जिसे मैं मॉकिटो का उपयोग करने से बचना चाहता हूं। – Anand

+1

मुझे समझ में नहीं आता है। आपको फ़ाइल में लिखने की आवश्यकता क्यों होगी? –

2

आप कर सकते थे अपने उत्पादन जो वास्तव में एक Printstream है, जो OutputStream का एक उपवर्ग है के लिए System.out का उपयोग करके देखें

देखें: http://docs.oracle.com/javase/6/docs/api/java/lang/System.html http://docs.oracle.com/javase/6/docs /api/java/io/PrintStream.html

0

आपको अपने getOutputStream का नकल करना चाहिए: मॉक आउटपुट स्ट्रीम ऑब्जेक्ट को वापस करना चाहिए। new FileOutputStream का आमंत्रण वास्तव में डिस्क पर फ़ाइल बनाता है।

सैद्धांतिक रूप से आप फ़ाइल सिस्टम को नकल कर सकते हैं लेकिन यह अधिक जटिल है।

और बीटीडब्ल्यू if(outputStream != null) अनावश्यक है: स्ट्रीम कभी शून्य नहीं हो सकती है। यदि इसे बनाया नहीं जा सकता है तो विधि को अपवाद फेंकना चाहिए। यह सी नहीं है, यह जावा है। :)

+0

दरअसल यह है कि मैंने \t \t किया था (testObj.getOutputStream (outputFileNameValidValue))। फिर वापसी (outputStreamMock); लेकिन जब मैं \t \t testObj.write (outputFileNameValidValue, reveredFileInput) को कॉल करता हूं; यह अभी भी फ़ाइल में खाली स्ट्रिंग लिख देगा। तो ऐसा लगता है कि वास्तव में डिस्क पर फ़ाइल बनाने से बचने के लिए मुझे फ़ाइल सिस्टम का नकल करना होगा। – Anand

+0

अगर (outputStream! = Null) इस पर सहमत हैं। मैं सिर्फ रक्षात्मक प्रोग्रामिंग के लिए उपयोग किया जाता है :) – Anand

0

आपको मॉक किया गया getOutputStream(String)java.io.StringWriter लौटाएं और फिर आप यह कह सकते हैं कि अपेक्षित सामग्री लिखी गई थी।

public void testFileWrite() throws IOException { 
    StringWriter writer = new StringWriter(); 
    when(testObj.getOutputStream(outputFileNameValidValue)).thenReturn(writer); 

    testObj.write(outputFileNameValidValue, reveredFileInput); 

    assertEquals(reveredFileInput, writer.toString()); 

    verify(writer).close(); 
} 
1

जैसा कि अन्य सुझाव दिया गया है कि आपको परीक्षण के तहत अपनी कक्षा में एक मॉक आउटपुटस्ट्रीम इंजेक्ट करने में सक्षम होना चाहिए। चूंकि परीक्षण के तहत आपकी कक्षा को आउटपुटस्ट्रीम की आवश्यकता होती है जो किसी दिए गए फ़ाइल में लिखता है, आपको परीक्षण के तहत अपनी कक्षा में एक मॉकटेबल आउटपुटस्ट्रीम फैक्ट्री इंजेक्ट करने की आवश्यकता होगी। - जहां बना सकता हूँ एक `OutputStreamWriter` - मैं इसे अपने कोड में नहीं दिख रहा है

import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.Mock; 
import org.mockito.runners.MockitoJUnitRunner; 

import java.io.IOException; 
import java.io.OutputStream; 

import static org.mockito.Mockito.verify; 
import static org.mockito.Mockito.when; 

@RunWith(MockitoJUnitRunner.class) 
public class Test9328173 { 

    private ClassUnderTest testObj; 

    @Mock 
    private OutputStreamFactory factory; 

    @Mock 
    private OutputStream stream; 

    @Before 
    public void setUp() throws Exception { 
     testObj = new ClassUnderTest(); 
     testObj.factory = factory; 
    } 

    @Test 
    public void testFileWrite() throws Exception { 
     when(factory.create("filename")).thenReturn(stream); 

     testObj.write("filename", new byte[]{1, 2, 3}); 

     verify(stream).write(new byte[]{1, 2, 3}); 
     verify(stream).close(); 
    } 

    private class ClassUnderTest { 

     private OutputStreamFactory factory; 

     public void write(String filename, byte[] content) throws IOException { 
      OutputStream stream = factory.create(filename); 
      try { 
       stream.write(content); 
      } finally { 
       stream.close(); 
      } 
     } 
    } 

    private interface OutputStreamFactory { 

     OutputStream create(String filename); 
    } 
} 
+0

दरअसल। एक सेटर/कन्स्ट्रक्टर तर्क/@ इंजेक्शन एनोटेशन फैक्ट्री की तुलना में थोड़ा आसान हो सकता है, लेकिन यह सत्यापित करने का तरीका है कि स्ट्रीम सही निर्देश प्राप्त करती है। – avandeursen