如何使用Arquillian测试以数据流方式启动下载的方法?

时间:2017-02-24 16:20:00

标签: java-ee integration-testing jboss-arquillian

我需要编写一堆集成测试(Arquillian框架),现在我在几个方面都在苦苦挣扎。下面是Controller中一个方法的示例,它启动Jasper报告的创建,然后将其流式传输到客户端:

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

2 个答案:

答案 0 :(得分:0)

  

这不是一个完整的答案,而且是自以为是的

您的方法没有输入或输出(仅副作用),并且它们包含一系列过程。如果可以用测试输入和期望值测试序列的每个步骤。  如果对于某些调用,由于某些原因直接测试它们使用真实组件是不可行的,那么就将它们模拟出来。如果你可以调用任何组件的某些部分方法,但其他部分不可行则使用间谍。

尽量远离国家设计和副作用方法。

答案 1 :(得分: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);
}