Для этого нам понадобятся следующие библиотеки:
- org.springframework:spring-test:4.1.7.RELEASE (для моков запроса и ответа)
- org.jsoup:jsoup:1.7.3 (для разбора хтмл страницы и выборки элементов на ней)
- шаблонизатор для генерации хтмл ответа сервлеты(ну можно например воспользоваться com.github.spullara.mustache.java:compiler:0.9.0)
Создаем базовый класс для всех наших тестов для сервлет:
А теперь вот созданим на его основе юнит тест:
Пример шаблона:
- org.springframework:spring-test:4.1.7.RELEASE (для моков запроса и ответа)
- org.jsoup:jsoup:1.7.3 (для разбора хтмл страницы и выборки элементов на ней)
- шаблонизатор для генерации хтмл ответа сервлеты(ну можно например воспользоваться com.github.spullara.mustache.java:compiler:0.9.0)
Создаем базовый класс для всех наших тестов для сервлет:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.net.URI;
import java.util.Map;
public abstract class BaseServletTest {
protected Document page;
protected MockHttpServletResponse lastResponse;
private HttpServlet servlet;
public HttpServlet getServlet() {
if (servlet != null) return servlet;
return servlet = createServlet();
}
protected abstract HttpServlet createServlet();
protected void get(String pathAndQuery) throws ServletException, IOException {
MockHttpServletRequest request = createRequest(pathAndQuery);
request.setMethod("GET");
doRequest(request);
}
protected void post(String pathAndQuery, Map params) throws ServletException, IOException {
MockHttpServletRequest request = createRequest(pathAndQuery);
request.addParameters(params);
request.setMethod("POST");
doRequest(request);
}
private void doRequest(HttpServletRequest request) throws ServletException, IOException {
MockHttpServletResponse response = new MockHttpServletResponse();
getServlet().service(request, response);
page = Jsoup.parse(response.getContentAsString());
lastResponse = response;
}
private MockHttpServletRequest createRequest(String pathAndQuery) {
URI uri = getUri(pathAndQuery);
MockHttpServletRequest request = new MockHttpServletRequest();
request.setRequestURI(uri.getPath());
request.setQueryString(uri.getQuery());
return request;
}
private URI getUri(String pathAndQuery) {
return URI.create("http://example.org" + pathAndQuery);
}
}
А теперь вот созданим на его основе юнит тест:
import org.junit.Test;
import shouty.core.Person;
import javax.servlet.ServletException;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static java.util.Arrays.asList;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
public class ShoutyServletTest extends BaseServletTest {
private final HashMap users = new HashMap(){{
put("root", mock(Root.class));
put("publisher", mock(Publisher.class));
}};
@Test
public void getShouldRespondWithHomepageForKnownUser() throws Exception {
get("/?param=value");
assertEquals(200, lastResponse.getStatus());
}
@Test
public void getShouldRespondWith401WhenUserNotRecognised() throws Exception {
get("/private/path");
assertEquals(401, lastResponse.getStatus());
assertThat(lastResponse.getErrorMessage(), containsString("Unauthorized"));
}
@Test
public void getRendersForTheHomepage() throws Exception {
get("/");
assertNotNull(page.select("h1#homeH1"));
}
@Test
public void getDisplaysMessagesHeardByUser() throws ServletException, IOException {
List messages = asList("one", "two");
Person lucy = mock(Person.class);
when(lucy.getMessagesHeard()).thenReturn(messages);
people.put("Lucy", lucy);
get("/?name=Lucy");
assertEquals("one", page.select(".message").get(0).text());
assertEquals("two", page.select(".message").get(1).text());
}
@Override
protected MyServlet createServlet() {
return new MyServlet(people);
}
}
Пример сервлеты:
import com.github.mustachejava.DefaultMustacheFactory;
import com.github.mustachejava.Mustache;
import com.github.mustachejava.MustacheFactory;
import User;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
public class MyServlet extends HttpServlet {
private final MustacheFactory mf = new DefaultMustacheFactory();
private final Mustache indexTemplate = mf.compile("templates/index.mustache");
private Map users;
public ShoutyServlet(Map users) {
this.users = users;
}
@Override
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
if (!authenticated(req)) {
sendAuthenticationError(req, res);
return;
}
Map context = new HashMap<>();
context.put("name", getName(req));
context.put("greetings", getUser(req).getGreetings());
indexTemplate.execute(res.getWriter(), context).flush();
}
private User getUser(HttpServletRequest req) throws UnsupportedEncodingException {
return users.get(getName(req));
}
private void sendAuthenticationError(HttpServletRequest req, HttpServletResponse res) throws IOException {
res.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized: " + getName(req));
}
private boolean authenticated(HttpServletRequest req) throws IOException {
return users.containsKey(getName(req));
}
private String getName(HttpServletRequest req) throws UnsupportedEncodingException {
Map queryParams = QueryString.toMap(req.getQueryString());
return queryParams.get("name");
}
}
Пример шаблона:
<!DOCTYPE html>
<html>
<body>
<h1 class="homeH1">{{personName}}"</h1>
<ul>
{{#greetings}}
<li class="greeting">{{.}}</li>
{{/greetings}}
</ul>
</body>
</html>
Комментариев нет:
Отправить комментарий