2017-02-24 1 views
0

Ich muss eine Reihe von Integrationstests (Arquillian Framework) schreiben und gerade jetzt kämpfe ich in einigen Bereichen. Hier ist ein Beispiel für ein Verfahren in einem Controller, der die Schaffung eines Jasper Bericht initiiert, die anschließend an den Client gestreamt wird:Wie kann ich eine Methode testen, die einen Download als Stream mit Arquillian startet?

public void executeFibuAuswertung(){ 
    Report report = reportService.find(99913L); 
    reportParameterForm.setReport(report); 
    List<ReportParameter> reportParameters = Collections.emptyList(); 
    createExcelReport(reportParameters); 
    reportExecutionController.streamReportResult(); 
} 

public void streamReportResult(){ 
    EnumReportFormat format = reportParameterForm.getSelectedFormat(); 

    ServletUtils.streamToClient(reportParameterForm.getReportResult() 
       , reportParameterForm.getReport().getTitle() + format.getFileExtention() 
       , format.getContentType() 
       , false); 
    facesContext.responseComplete(); 
} 

Wie kann ich einen Test für diese mit dem Arquillian Rahmen schreiben?

Zu diesem Zeitpunkt sieht mein Test wie folgt aus:

@Before 
public void before() { 
    FacesContext context = ContextMocker.mockFacesContext(); 
    ContextMocker.mockPostback(context, false); 
    ContextMocker.mockFacesMessages(context); 
    ContextMocker.mockFindComponent(UIComponent.getCurrentComponent(context), context); 
} 

@Test(expected = NullPointerException.class) 
@WindowScopeRequired 
public void testExecuteAuswertung1() throws Exception { 
    fibuController.executeAuswertung(); 
    byte[] content = reportParameterForm.getReportResult(); 
    Assert.assertNotNull(content); 
} 

Offensichtlich ist dies nicht viel Sinn machen. Es ist die folgende Codezeile, die die Nullpointer wirft:

HttpServletResponse resp = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); 

Antwort

0

Dies ist die Lösung, die ich am Ende umgesetzt:

@Mock 
private HttpServletResponse httpServletResponse; 

@Mock 
private HttpServletRequest httpServletRequest; 

@Mock 
ExternalContext externalContext; 

@Before 
public void before() { 
    MockitoAnnotations.initMocks(this); 
    FacesContext context = ContextMocker.mockFacesContext(); 
    when(context.getExternalContext()).thenReturn(externalContext); 
    ContextMocker.mockPostback(context, false); 
    ContextMocker.mockFacesMessages(context); 
    ContextMocker.mockNavigationhandlers(context); 
    ContextMocker.mockFindComponent(UIComponent.getCurrentComponent(context), context); 
} 
0

Dies ist keine vollständige Antwort und es ist

Sie haben Methoden opinionated, die keinen Eingang oder Ausgang haben (nur Nebenwirkung) und sie enthalten Abfolge von Prozeduren. Wenn es möglich ist, jeden Schritt der Sequenz mit Testeingabe und erwarteten Werten zu testen. Wenn es für einige Anrufe aus irgendwelchen Gründen nicht möglich ist, sie direkt für die Verwendung von realen Komponenten zu testen, dann verspotten Sie sie. Wenn Sie einen Teil der Methoden einer Komponente aufrufen können, aber andere Teile nicht realisierbar sind, verwenden Sie Spione.

Und versuchen Sie, von State-Full-Designs und Nebenwirkung nur Methoden so viel wie Sie können.

+0

gute Vorschläge, danke! Ich werde daran arbeiten, diese Nebenwirkungen zu reduzieren. – Robert

+0

Ich würde immer noch schätzen, wenn jemand den einfachsten Weg vorschlagen kann, die zweite Methode zu testen, insbesondere, welche Mocks ich erstellen muss. Ich nehme an, das Senden einer Stream-Methode '' ServletUtils.streamToClient' Methode ist ziemlich Standard. – Robert

Verwandte Themen