JUnit тестирование с пружиной - PullRequest
2 голосов
/ 23 сентября 2011

Я пытаюсь создать тест junit для метода контроллера пружины, но получаю следующее сообщение об ошибке

java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, 
or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, 
your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
at org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes(RequestContextHolder.java:123)

Я добавил обе вещи, которые мне нужны (я пробовал каждую из них отдельно), и в настоящее время мой web.xml содержит

<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
 </listener>

<filter> 
    <filter-name>requestContextFilter</filter-name> 
    <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class> 
</filter> 
    <filter-mapping> 
    <filter-name>requestContextFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping>

и метод, который я пытаюсь протестировать, похож на

@Controller
@RemotingDestination
public class MyController {

public Response foo()
    {
//...
        ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
        HttpSession httpSession = attr.getRequest().getSession(true);
//...
}

и мой тест junit просто вызывает myController.foo () и проверяет ответ. Поэтому я не могу создать фиктивный объект для передачи в метод, чтобы обойти эту проблему.

Итак, я полагаю, что мой вопрос заключается в том, существует ли какая-то конфигурация или хитрость, на которую я еще не наткнулся, которая сделает этот запуск без необходимости рефакторинга метода моего контроллера?

1 Ответ

3 голосов
/ 23 сентября 2011

Сообщение об ошибке довольно ясно.К сожалению, ваш код требует небольшой переписки.

Прежде всего при тестировании вашего контроллера вы (очевидно) не находитесь внутри веб-запроса.Вот почему RequestContextHolder.currentRequestAttributes() не работает.Но вы можете сделать так, чтобы ваш тест проходил и , чтобы сделать код более читабельным, используя следующую технику (при условии, что вам необходим сеанс HTTP для получения какого-либо фактического атрибута из него):

public Response foo(@SessionAttribute("someSessionAttribute") int id)

Таким образом Spring MVC автоматически извлечет сессию и загрузит someSessionAttribute, когда находится внутри веб-запроса (и даже выполнит необходимое преобразование).Но когда вы тестируете контроллер, просто вызывайте метод с фиксированным параметром.Нет кода запроса / инфраструктуры сеанса.Намного чище (обратите внимание, что две строки в foo, которые вы указали, совсем не нужны).

Другое решение - зарегистрировать RequestScope вручную.Смотрите пример здесь .Это должно работать без изменения какого-либо кода с помощью имитации запроса и сеанса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...