Jakarta ee 如何测试使用Arquillian将下载初始化为流的方法?

Jakarta ee 如何测试使用Arquillian将下载初始化为流的方法?,jakarta-ee,integration-testing,jboss-arquillian,Jakarta Ee,Integration Testing,Jboss Arquillian,我需要编写一系列集成测试(Arquillian框架),现在我正在几个领域中苦苦挣扎。以下是控制器中的方法示例,该方法启动Jasper报告的创建,该报告随后流式传输到客户端: public void executeFibuAuswertung(){ Report report = reportService.find(99913L); reportParameterForm.setReport(report); List<ReportParameter> rep

我需要编写一系列集成测试(Arquillian框架),现在我正在几个领域中苦苦挣扎。以下是控制器中的方法示例,该方法启动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();
}
显然,这没有多大意义。引发NullPointerException的是以下代码行:

    HttpServletResponse resp = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
这不是一个完整的答案,它是自以为是的

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


并尽可能远离全状态设计和仅产生副作用的方法。

这是我最后实施的解决方案:

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

好的建议,谢谢!我将致力于减少那些只产生副作用的方法。如果有人能建议测试第二种方法的最简单方法,特别是我必须创建的模拟,我将不胜感激。我认为发送流方法`ServletUtils.streamToClient`是相当标准的。
@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);
}