簡體   English   中英

Spring 3.2.4中的PowerMockito模擬靜態測試控制器

[英]PowerMockito mocking static testing controller in spring 3.2.4

我正在執行一些模擬測試,但是1類的靜態方法存在一些問題,我在測試類的setUp()方法中進行了模擬

上這堂課:

public class ResponseFileWriteHelper {


    public static void write(HttpServletResponse response, String fileName, StreamWriter writer) {

        response.setHeader("Cache-Control", "");
        response.setContentType("application/octet");
        if (!StringUtils.isBlank(fileName)) {
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
        }

        try {
            writer.doWrite(response.getOutputStream());
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }    
    }
}

這是我要測試的控制器:

public class ManageDeviceController extends SimpleFormController {

...

private void generateDevicexBeneficiaryList(
            Collection<Integer> selectedYears, PriorityAreaKey priorityAreaKey, Language language, Collection<DeviceStatus> statuses, HttpServletResponse response) throws Exception {

        final List<ReportItem> reportItems
            = DeviceListReportService.getDevicesxBeneficiaryForYears(selectedYears, priorityAreaKey, language, statuses);

        ResponseFileWriteHelper.write(response, "DevicesxBeneficiaryList.xls", new StreamWriter() {

            @Override
            public void doWrite(OutputStream outputStream) throws Exception {
                DeviceListExcelReportRendererBuilder.build().renderToStream(
                    reportItems, outputStream);
            }});
    }

}

這里的考試課

@RunWith(MockitoJUnitRunner.class)
public class SelectDeviceListExcelReportControllerTest {

    public void setUp() {
        PowerMockito.mockStatic (ResponseFileWriteHelper.class);
        EDeviceSessionContext.getInstance().setSession(httpSession);
        when(request.getSession()).thenReturn(httpSession);
        when(request.getLocale()).thenReturn(Locale.ENGLISH);
        messages.initialize();
    }

    @SuppressWarnings("unchecked")
    @Test
    @PrepareForTest(ResponseFileWriteHelper.class)
    public void successTest() throws Exception {

        TableItemBuilder tableItemBuilder = 
                new TableItemBuilder(new LabelCellItem("success.test"));

        List<ReportItem> expectedData = Arrays.asList(
            new ReportItem("success.test",Arrays.asList(tableItemBuilder.getTableItem())));

        final ByteArrayOutputStream resultData = new ByteArrayOutputStream();

        ServletOutputStream output = new ServletOutputStream() {

            @Override
            public void write(int val) throws IOException {
                resultData.write(val);
            }
        };

        when(response.getOutputStream()).thenReturn(output);

        when(deviceListReportService.getDevicesxBeneficiaryForYears(
            any(List.class), any(PriorityAreaKey.class), any(Language.class), any(Collection.class))).thenReturn(expectedData);


        doCall();

        //assertArrayEquals(expectedData, resultData);
    }
}

但是測試失敗,因為這里有一個java.lang.NullPointer:

ResponseFileWriteHelper.write(response, "DevicesxBeneficiaryList.xls", new StreamWriter() {

@PrepareForTest()僅與測試類中的PowerMockRunner.class一起使用,因此您需要在測試類中添加@RunWith(PowerMockRunner.class)

但是另一個問題是,您真的想使用SpringJUnit4ClassRunner.class作為測試運行程序,感謝powermock已經意識到了這個問題,它提供了PowerMockRunnerDelegate注釋來實現它。

工作副本將如下所示:

@WebAppConfiguration
@ContextConfiguration(locations = {
        "......"
        )
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)
@PowerMockIgnore("javax.management.*") // to specify that all classes under the specified package be loaded by the system class loader
@PrepareForTest({Static.class})
public void ControllerTest {
    public void testMockStatic() {
        PowerMockito.mockStatic(Static.class);
        ......
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM