2017-09-22 5 views
-1

Welche unterschiedlichen Möglichkeiten könnte ich testen, um die IOException abzufangen?Komponententest IOException

@Override 
public void renderOriginalContent(final Document document, final OutputStream outputStream, final User user) 
{ 
    if (Hibernate.isInitialized(document.getOriginalContent())) 
    { 
     try (final InputStream contentIS = document.getOriginalContent().getInputStream(); 
      final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream)) 
     { 
      final byte[] buffer = new byte[4096]; 
      int read = contentIS.read(buffer); 
      while (read != -1) 
      { 
       bufferedOutputStream.write(buffer, 0, read); 
       read = contentIS.read(buffer); 
      } 
      logDocumentAccessEvent(user, document); 
     } 
     catch (final IOException e) 
     { 
      throw new RuntimeException(e); 
     } 
    } 
    else 
    { 
     renderOriginalContent(document.getId(), outputStream, user); 
    } 
} 

Ich habe eine generische Testmethode, die ich geändert habe, um zu versuchen, die IOException ausgelöst zu bekommen. Hat jemand irgendwelche Antworten, wie man die IOException erwischt?

@Test 
public void testRenderOriginalContentWithDocument() throws Exception 
{ 
    final TestDocumentController documentService = EJBs.get(TestDocumentController.class); 
    final User user = Tests.getUser(); 
    final Document document = Tests.getDocument(); 
    final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 

    try 
    { 
     documentService.renderOriginalContent(document, outputStream, user); 
    } 
    catch (Exception e) 
    { 
     Assert.assertTrue(e.getCause() instanceof IOException); 
    } 
} 
+2

Wie wäre es mit [Mockito] (http://site.mockito.org/)? – Thibstars

+0

Hinweis: Wenn Sie im obigen Test eine Ausnahme nicht auslösen, wird Ihr Test bestanden. Zumindest würde ich eine fail() -Anweisung in Ihrem try-Block verwenden –

Antwort

1

Sie werden lachen: Schließen Sie den Ausgabestrom vor dem Aufruf der Funktion.

+0

Ich habe outputStream.close() kurz vor dem Funktionsaufruf versucht, aber es löst keine Ausnahme aus. Mache ich etwas falsch? – user3586417

+0

Es wird keine _any_ Ausnahme ausgelöst? War dein Dokument leer, so dass du 'write()' nie aufgerufen hast? –

+0

Ich kann immer noch erfolgreich durchlaufen, obwohl outputStream geschlossen oder null ist, und das Dokument ist nicht leer. – user3586417

0

das Dokument, das Sie versuchen zu verwenden, machen es null.

+0

Dies liefert keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag. - [Aus Bewertung] (/ review/low-quality-posts/17421435) –

0

Sie können einen eigenen Test-OutputStream implementieren, der nur die Ausnahme auslöst und sie in der Testmethode verwendet. Dann können Sie die Testmethode mit

@Test(expected = IOException.class) 

jedoch bewusst sein, mit Anmerkungen versehen, dass Sie die IOException als Runtime sind Erneutes Auslösen, so nach dem Wurf ist es nicht mehr IOException.