Переопределение метода init() ServletConfig

 
 
 
Сообщения:41
Делала веб-сервис типа CRUD-приложения в контейнере Tomcat, задалась вопросом. как же можно написать к нему тестов. Использую JUnit5 и spring-mock (для создания MockHttpServletRequest/Response)
В интернете оказалось маловато информации-руководства о том как использовать корректно эту библиотеку с объектами((
class AddServletTest {

    MockHttpServletRequest request = new MockHttpServletRequest();
    MockHttpServletResponse response = new MockHttpServletResponse();
    Model model = Model.getInstance();

    AddServlet servlet = new AddServlet();

    @Test
    void doPost() throws ServletException, IOException, ParseException {

        request.setParameter("name", "some pills");
        request.setParameter("action", "headache");
        request.setParameter("form", "liquid");
        request.setParameter("date", "2021-01-01");

        //servlet.service(request, response); - assertion error - в список значение по названиям пилюль не добавляется

        servlet.doPost(request, response); //java.lang.IllegalStateException: ServletConfig has not been initialized

        Pills pill = new Pills("some pill", "headache", "liquid",
                new SimpleDateFormat("yyyy-MM-dd").parse("2021-01-01"));

        assertEquals(model.list().size(), 1);
        assertEquals(model.list().get(0), pill);

        model.list().clear();

    }


из стектрейса можно догадаться, что следует переопределить метод init() ServletConfig, но я новичок в этом деле и даже не могу представить, как это можно сделать. Помогите, пожалуйста(
Возможно можно использовать mockito для имитации того что tomcat вызвал метод init() сервлета, но, к сожалению ,я так же не представляю как это выглядит(
 
 
Сообщения:41
ну в общем, и при использовании обычного mockito так же выдает ошибку, что конфиг не инициализирован:
@Test
    void doPost() throws ServletException, IOException, ParseException {

        HttpServletRequest request = mock(HttpServletRequest.class);
        HttpServletResponse response = mock(HttpServletResponse.class);

        when(request.getParameter("name")).thenReturn("some pills");
        when(request.getParameter("action")).thenReturn("headache");
        when(request.getParameter("form")).thenReturn("Liquid");
        when(request.getParameter("date")).thenReturn("2021-01-01");

        new AddServlet().doPost(request, response);

        Pills pill = new Pills("some pills", "headache", "Liquid",
                new SimpleDateFormat("yyyy-MM-dd").parse("2021-01-01"));

        assertEquals(model.list().size(), 1);
        assertEquals(model.list().get(0), pill);

    }


java.lang.IllegalStateException: ServletConfig has not been initialized

	at javax.servlet.GenericServlet.getServletContext(GenericServlet.java:200)
 
 
Сообщения:18
Мало информации, опишите подробнее, что за приложение (на сервлетах или spring/spring-boot, др.).
AddServlet
ваш класс? Если я правильно догадался, то вы создали
AddServlet
и в
doPost
написали какую-то логику, которую хотите протестировать. Правильно?
model
как инициализируется в тесте?
 
 
Сообщения:41
Maxuz:
Мало информации, опишите подробнее, что за приложение (на сервлетах или spring/spring-boot, др.).
AddServlet
ваш класс? Если я правильно догадался, то вы создали
AddServlet
и в
doPost
написали какую-то логику, которую хотите протестировать. Правильно?
model
как инициализируется в тесте?

Все верно. Пишу на сервлетах,
model = Model.getInstance()  
 
 
Сообщения:18
Приложение запускаете на glassfish?
От какого класса унаследован AddServlet?
 
 
Сообщения:41
Maxuz:
Приложение запускаете на glassfish?
От какого класса унаследован AddServlet?

Запускается на tomcat, унаследован от HttpServlet
Мне нужно протестить его, не запуская сервер. Никаких полей, помимо локальных в методе doPost у него нет. Он получает параметры класса, делает экземпляр и добавляет в ArrayList. Tomcat сам инициализирует сервлет и его контекст, но, повторюсь, запускать его нельзя) а если не запускать, ввлазит ошибка, что метод не инициализирован. Гугл говорит, что нужно переопределить метод init() сервлета(самого обычного который в jee),но в исходниках он пустой. Поэтому и задаюсь вопросом, как это можно сделать
 
 
Сообщения:18
Попробуйте добавить строку (там где все остальные методы мокаются):
when(request.getMethod()).thenReturn("POST");


Покажите весь stack trace ошибки, это поможет понять где сломалось, на создании объекта, или на вызове метода.
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет