【问题标题】:How can I test a method that initaiates a download as stream using Arquillian?如何测试使用 Arquillian 将下载作为流启动的方法?
【发布时间】:2017-02-24 16:20:00
【问题描述】:

我需要编写一堆集成测试(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();
}

如何使用 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();

【问题讨论】:

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


    【解决方案1】:

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

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

    并尽量远离状态完整的设计和仅具有副作用的方法。

    【讨论】:

    • 好建议,谢谢!我会努力减少那些只有副作用的方法。
    • 如果有人能提出最简单的方法来测试第二种方法,我仍然会很感激,特别是我必须创建什么 Mocks。我想发送流方法 ``ServletUtils.streamToClient` 方法是相当标准的。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-04
      相关资源
      最近更新 更多