如何使用 Arquillian 测试将下载作为流启动的方法?
How can I test a method that initaiates a download as stream using Arquillian?
我需要编写一堆集成测试(Arquillian 框架),现在我在几个方面苦苦挣扎。下面是 Controller 中方法的示例,它启动了 Jasper Report 的创建,随后将其流式传输到客户端:
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();
This is not a complete answer and it is opinionated
你有没有输入或输出(只有副作用)的方法,它们包含过程序列。如果可能的话,使用测试输入和预期值测试序列的每个步骤。
如果对于某些调用,由于某些原因无法直接测试它们以使用真实组件,则将它们模拟出来。如果您可以调用任何组件的某些方法,但其他部分不可行,请使用间谍。
并尽量远离全状态设计和只有副作用的方法。
这是我最后实现的解决方案:
@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);
}
我需要编写一堆集成测试(Arquillian 框架),现在我在几个方面苦苦挣扎。下面是 Controller 中方法的示例,它启动了 Jasper Report 的创建,随后将其流式传输到客户端:
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();
This is not a complete answer and it is opinionated
你有没有输入或输出(只有副作用)的方法,它们包含过程序列。如果可能的话,使用测试输入和预期值测试序列的每个步骤。 如果对于某些调用,由于某些原因无法直接测试它们以使用真实组件,则将它们模拟出来。如果您可以调用任何组件的某些方法,但其他部分不可行,请使用间谍。
并尽量远离全状态设计和只有副作用的方法。
这是我最后实现的解决方案:
@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);
}