2017-02-24 59 views
0

我需要編寫一堆集成測試(Arquillian框架),現在我正在幾個領域掙扎。這裏是一個控制器的方法,發起Jasper報表,隨後將其傳送到客戶端創建的一個例子:我該如何測試一種使用Arquillian啓動下載流的方法?

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(); 
} 

我怎麼能寫使用的Arquillian框架這樣的測試?

在這個時候,我的測試是這樣的:

@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); 
} 

很顯然,這並沒有太大的意義。這是下面的代碼行拋出的NullPointerException異常:

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

回答

0

這是我最終實現的解決方案:

@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

這不是一個完整的答案,它是自以爲是

您還有沒有輸入或輸出方式(唯一的副作用)和他們包含程序的序列。如果可以用測試輸入和期望值測試序列的每個步驟。 如果對於某些調用,由於某些原因直接使用真實組件進行測試並不可行,然後將它們模擬出來。如果你可以調用任何組件的某些部分方法,但其他部分不可行使用間諜。

儘量遠離國家完整設計和副作用方法。

+0

好的建議,謝謝!我將努力減少那些僅有副作用的方法。 – Robert

+0

如果任何人都可以建議測試第二種方法的最簡單方法,具體來說,我將不得不創建哪些Mocks,我仍然會很感激。我想發送一個流方法「ServletUtils.streamToClient」方法是相當標準的。 – Robert

相關問題