Контроллер PowerMockito для имитации статического тестирования весной 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() {

1 ответ

@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);
        ......
    }
}
Другие вопросы по тегам