Как издеваться над HttpServletRequest?
У меня есть функция, которая ищет параметр запроса и возвращает логическое значение:
public static Boolean getBooleanFromRequest(HttpServletRequest request, String key) {
Boolean keyValue = false;
if(request.getParameter(key) != null) {
String value = request.getParameter(key);
if(keyValue == null) {
keyValue = false;
}
else {
if(value.equalsIgnoreCase("true") || value.equalsIgnoreCase("1")) {
keyValue = true;
}
}
}
return keyValue;
}
У меня есть junit и easymock в моем pom.xml, как мне смеяться над HttpServletRequest?
Ответы
Ответ 1
HttpServletRequest очень похож на любой другой интерфейс, поэтому вы можете издеваться над ним, следуя EasyMock Readme
Вот пример того, как unit test ваш метод getBooleanFromRequest
// static import allows for more concise code (createMock etc.)
import static org.easymock.EasyMock.*;
// other imports omitted
public class MyServletMock
{
@Test
public void test1()
{
// Step 1 - create the mock object
HttpServletRequest req = createMock(HttpServletRequest.class);
// Step 2 - record the expected behavior
// to test true, expect to be called with "param1" and if so return true
// Note that the method under test calls getParameter twice (really
// necessary?) so we must relax the restriction and program the mock
// to allow this call either once or twice
expect(req.getParameter("param1")).andReturn("true").times(1, 2);
// program the mock to return false for param2
expect(req.getParameter("param2")).andReturn("false").times(1, 2);
// switch the mock to replay state
replay(req);
// now run the test. The method will call getParameter twice
Boolean bool1 = getBooleanFromRequest(req, "param1");
assertTrue(bool1);
Boolean bool2 = getBooleanFromRequest(req, "param2");
assertFalse(bool2);
// call one more time to watch test fail, just to liven things up
// call was not programmed in the record phase so test blows up
getBooleanFromRequest(req, "bogus");
}
}
Ответ 2
Используйте какую-то насмешливую структуру, например. Mockito или JMock, который поставляется с насмешливой емкостью таких объектов.
В Mockito вы можете насмехаться как:
HttpServletRequest mockedRequest = Mockito.mock(HttpServletRequest.class);
Подробнее о Mockito см.: Как его выпить? на сайте Mockito.
В JMock вы можете насмехаться как:
Mockery context = new Mockery();
HttpServletRequest mockedRequest = context.mock(HttpServletRequest.class);
Подробнее о jMock см. jMock - Начало работы
Ответ 3
Это старый поток... но вопрос все еще имеет значение.
Другим хорошим выбором является MockServiceRequest и MockServiceResponse в структуре Spring:
http://docs.spring.io/spring/docs/2.0.x/api/org/springframework/mock/web/package-summary.html
Ответ 4
Я не знаю про easymock, но в книге "Тестирование модулей на Java: как тестировать код" Johannes Link содержит объяснения как тестировать сервлеты, используя библиотеку, которую он построил из фиктивных объектов.
Сопутствующий сайт для книги теперь ушел (изменение в издательской компании чего-то...), но сайт-компаньон из оригинальной немецкой публикации все еще. Из него вы можете загрузить определения всех фиктивных объектов.
Ответ 5
Посмотрите на Mockrunner: http://mockrunner.sourceforge.net/
В нем много простых в использовании Java EE mocks, включая HttpServletRequest и HttpServletResponse.