Запуск Jetty с контекстом Spring в тестах - PullRequest
0 голосов
/ 22 ноября 2011

Мне нужно запустить Jetty сервер и запустить его в начале теста.Сервер Jetty должен подобрать контекст Spring и запустить набор служб RESTful.Затем мне нужно взять контекст, используемый Jetty, и внедрить некоторую фиктивную реализацию службы в определенный компонент поставщика услуг, чтобы я мог проверить, что служба получает правильный запрос и ответ, а также выполняет аутентификацию.

Я создал простой класс начальной загрузки:

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class RESTServiceTest {

    @BeforeClass
    public static void setUp() throws Exception {
        Server server = new Server(8080);
        WebAppContext ctx = new WebAppContext();
        ctx.setContextPath("/");
        ctx.setWar("src/main/webapp");
        ctx.setServer(server);
        server.setHandler(ctx);
        server.start();
        Thread.sleep(5000);
    }

    @Test
    public void testPush() throws Exception {
        // do some tests here...
    }
}

Однако при запуске этого юнит-теста я получаю следующую ошибку:

Context initialization failed
java.lang.IllegalStateException: Failed to invoke Servlet 2.5 getContextPath method
at  org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:365)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:278)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:640)
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:229)
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1208)
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:586)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:449)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:58)
at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:89)
at org.eclipse.jetty.server.Server.doStart(Server.java:258)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:58)
....
Caused by: java.lang.NoSuchMethodException: javax.servlet.ServletContext.getContextPath()
at java.lang.Class.getMethod(Class.java:1622)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:360)
... 30 more

Поэтому я сомневаюсь, что здесь может быть не так, и является ли подход, который я выбрал, правильнымone?

Что мне нужно, чтобы запустить Jetty и запустить Spring Spring?А как получить ссылку на контекст Spring после, чем в теле теста, чтобы я мог получить служебный бин и вызывать некоторые сеттеры с поддельным подуслугой?

Пожалуйста, советуйте.

Я ненужно создавать модульные тесты - это что-то вроде сквозного теста с макетами.

1 Ответ

4 голосов
/ 22 ноября 2011

Метод javax.servlet.ServletContext.getContextPath() не существует (и, следовательно, не может быть вызван).

Это будет означать, что у вас есть старый servlet-X.jar в вашем классе. Метод getContextPath() используется начиная с Servlet 2.5, поэтому вам нужно как минимум 2.5. Проверьте и исправьте свои зависимости (особенно транзитивные) в этом отношении.

...