2017-03-10 4 views
1

Ich versuche, JUnit mit MockitoJUnitRunner schreiben. Ich übergebe Datei-ID an meine Funktion, die Datei aus der Cloud herunterlädt und Zip-Datei als Download zurückgibt. hier ist mein CodeAntwort in zipoutputstream bestätigen

public void getLogFile(HttpServletResponse response, String id) throws IOException { 

    response.setContentType("Content-type: application/zip"); 
    response.setHeader("Content-Disposition", "attachment; filename=LogFiles.zip"); 

    ServletOutputStream out = response.getOutputStream(); 
    ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(out)); 

    zos.putNextEntry(new ZipEntry(id)); 

    InputStream inputStream = someDao.getFile(id); 

    BufferedInputStream fif = new BufferedInputStream(inputStream); 

    int data = 0; 

    while ((data = fif.read()) != -1) { 
     zos.write(data); 
    } 

    fif.close(); 

    zos.closeEntry(); 
    zos.close(); 
} 

Und meine JUnit-Funktion ist

@Mock 
private MockHttpServletResponse mockHttpServletResponse; 

anyInputStream = new ByteArrayInputStream("test data".getBytes()); 

    @Test 
    public void shouldDownloadFile() throws IOException { 

    ServletOutputStream outputStream = mock(ServletOutputStream.class); 

     when(mockHttpServletResponse.getOutputStream()).thenReturn(outputStream); 


=>   when(someDao.download(anyString())).thenReturn(anyInputStream); 


     controller.getLogFile(mockHttpServletResponse, id); 

     verify(mockHttpServletResponse).setContentType("Content-type: application/zip"); 

     verify(mockHttpServletResponse).setHeader("Content-Disposition","attachment; filename=LogFiles.zip"); 

     verify(atmosdao).download(atmosFilePath); 
    } 

Diese Einheit Test vorbei ist, aber ich möchte, um zu überprüfen, was auf output geschrieben ist, wie kann ich es tun? wie ich zu „Testdaten“ verspottet schreibe output wie

anyInputStream = new ByteArrayInputStream("test data".getBytes()); 

when(someDao.download(anyString())).thenReturn(anyInputStream); 

mockHttpServletResponse.getContentAsString() gibt mir null!

Ist es möglich, MockHttpServletResponse zu behaupten, die mit zipoutputStream geschrieben wird? Wenn ja, wie kann ich es tun?

Danke.

public class CustomOutputStream extends ServletOutputStream { 
    private ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    private String content; 

    @Override 
    public void write(int b) throws IOException { 
     out.write(b); 
    } 

    @Override 
    public void close() throws IOException { 
     content = new String(out.toByteArray()); 
     out.close(); 
     super.close(); 
    } 

    public String getContentAsString() { 
     return this.content; 
    } 
} 

Diese Klasse speichert alle Bytes geschrieben, um es und sie im content Feld halten:

Antwort

1

Statt spöttisch Ihre OutputStream, könnten Sie eine benutzerdefinierte erstellen.

Dann ersetzen Sie diese:

ServletOutputStream outputStream = mock(ServletOutputStream.class); 

durch diese:

CustomOutputStream outputStream = new CustomOutputStream(); 

Wenn Ihr Servlet getOutputStream() nennt, wird es die Gewohnheit verwenden ein, und am Ende getContentAsString() kehren Sie den Ausgang, wurde in dein Servlet geschrieben.

Hinweis: die Ausgabe ist gezippt, so dass die Zeichenfolge seltsame Zeichen enthält. Wenn Sie die ursprüngliche Zeichenfolge möchten, müssen Sie sie entpacken (und in diesem Fall würde ich das by out.toByteArray() zurückgegebene Byte-Array anstelle der Zeichenfolge verwenden, da beim Erstellen einer Zeichenfolge auf diese Weise Codierungsprobleme beim Aufruf string.getBytes() auftreten können)

+0

Das funktioniert! Danke Hugo ... – Ali

+0

Gern geschehen, gerne helfen –

+0

Hallo Hugo, gibt es eine Möglichkeit zu überprüfen, ob Zip-Datei in Outputstream vorhanden ist? – Ali

1

Ich habe bekommen, was ich gesucht habe ... Dies ist, was ich getan habe, um Daten zu behaupten, die mit PowerMockito zu zipoutputStream geschrieben sind.

@Test 
public void ShouldAttemptToWriteDownloadedFileToZipOutputStream() throws Exception { 

    InputStream anyInputStream = new ByteArrayInputStream("test data".getBytes()); 

    ServletOutputStream outputStream = mock(ServletOutputStream.class); 

    BufferedOutputStream bufferedOutputStream = Mockito.mock(BufferedOutputStream.class); 
    PowerMockito.whenNew(BufferedOutputStream.class).withArguments(outputStream).thenReturn(bufferedOutputStream); 

    ZipOutputStream zipOutputStream = Mockito.mock(ZipOutputStream.class); 
    PowerMockito.whenNew(ZipOutputStream.class).withArguments(bufferedOutputStream).thenReturn(zipOutputStream); 

    BufferedInputStream bufferedInputStream = new BufferedInputStream(anyInputStream); 
    PowerMockito.whenNew(BufferedInputStream.class).withArguments(anyInputStream).thenReturn(bufferedInputStream); 

    subjectUnderTest.getLogFile(mockHttpServletResponse, "12345"); 

    int data = 0; 

    while ((data = bufferedInputStream.read()) != -1) { 

     verify(zipOutputStream).write(data); 
    } 
} 

Danke Hugo für Ihre Hilfe!

Verwandte Themen