gpt4 book ai didi

java - 用于自动化测试的嵌入式 jetty

转载 作者:行者123 更新时间:2023-11-30 09:14:13 28 4
gpt4 key购买 nike

我正在尝试使用嵌入式 jetty 来自动测试网络服务。但是,当我尝试访问该服务时,我不断收到错误 404。

这是我的 src/main/webapp/WEB-INF/web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>Snafucator</display-name>

<session-config>
<session-timeout>60</session-timeout>
</session-config>

<context-param>
<param-name>webAppRootKey</param-name>
<param-value>Snafucator</param-value>
</context-param>

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

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:snafucator.service.xml</param-value>
</context-param>

<servlet>
<servlet-name>jaxws-servlet</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSSpringServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>jaxws-servlet</servlet-name>
<url-pattern>/Snafucator</url-pattern>
</servlet-mapping>

我还希望我的 src/test/resources 位于类路径中,因为它们包含 DAO 的设置和实现该服务的其他组件。服务所需的所有 bean 都在 snafucator.service.xml 中配置。这主要是通过加载几个 spring 上下文文件来实现的。这些是来自较低层的文件和定义服务绑定(bind)和实现的 snafucator.context.xml:

<import resource="classpath*:setup.context.xml" />
<import resource="classpath*:core.context.xml" />
<import resource="classpath*:snafucator.context.xml" />

此外,我需要类路径上的目标/类,因为它包含 snafucator.context.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:ws="http://jax-ws.dev.java.net/spring/core" xmlns:wss="http://jax-ws.dev.java.net/spring/servlet"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.0.xsd
http://jax-ws.dev.java.net/spring/core
http://jax-ws.dev.java.net/spring/core.xsd
http://jax-ws.dev.java.net/spring/servlet
http://jax-ws.java.net/spring/servlet.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<!-- enable autowiring by annotations -->
<context:annotation-config />

<wss:binding url="/Snafucator">
<wss:service>
<ws:service bean="#snafucatorWs" />
</wss:service>
</wss:binding>
<bean id="snafucatorWs" class="com.snafu.SnafucatorWSImpl" />

这就是我启动 jetty 的方式:

    server = new Server(iPort);
WebAppContext root = new WebAppContext();
root.setExtraClasspath("target/classes/,src/test/resources/");
root.setDescriptor("src/main/webapp/WEB-INF/web.xml");
root.setResourceBase("src/main/webapp");
root.setWar("src/main/webapp");
root.setContextPath("/");
root.setServer(server);
root.setParentLoaderPriority(true);
server.setHandler(root);

System.out.println("Starting jetty server on port:" + iPort);
server.start();
System.out.println("Jetty server is started!");

当我访问 "http://localhost:8082" 时,我看到了 WEB-INF 和 META-INF 目录,所以 Jetty 正在运行。当我尝试 "http://localhost:8082/Snafucator" 时,我收到错误 404 并且命令行显示“JAX-WS-Servlet Initialized”。当我访问 "http://localhost:8082" 下的任何其他 url 时,我得到一个格式略有不同的 404。所以我假设发生了一些 WS 处理。我还在开发一个 Web 应用程序,该服务旨在成为其中的一部分。当我将 snafucator.context.xml 包含到该应用程序的上下文中并使用 jetty eclipse 插件启动应用程序时,一切正常。但是对于自动化测试,我需要独立启动服务。

顺便说一下,我使用的是 Jetty 7.6.14。

我做错了什么?

最佳答案

抱歉耽搁了。我使用没有 WAR 的嵌入式 jetty 。下面是 Jetty 的简单包装器。您可以通过启动上下文或使用

在测试中手动启动它
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "path/testContext.xml" })

包装类

public class JettyWrapper extends Server implements ApplicationContextAware {
private ApplicationContext appContext;

@Override
protected void doStart() throws Exception {

final ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
final GenericWebApplicationContext webApplicationContext = new GenericWebApplicationContext();
webApplicationContext.setServletContext(context.getServletContext());
webApplicationContext.setParent(appContext);
context.getServletContext().setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, webApplicationContext);
webApplicationContext.refresh();
DispatcherServlet dispatcherServlet = new DispatcherServlet();
dispatcherServlet.setContextConfigLocation("classpath:servlet-context.xml");
context.addServlet(new ServletHolder(dispatcherServlet), "/*");
context.setContextPath("/");
setHandler(context);
super.doStart();
}

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.appContext = applicationContext;
}

在上下文中:

<bean id="webServer" class="package.JettyWrapper"
destroy-method="stop" init-method="start">
<property name="connectors">
<list>
<bean id="Connector" class="org.eclipse.jetty.server.nio.SelectChannelConnector">
<property name="port" value="${jetty-port}" />
</bean>
</list>
</property>

希望对你有帮助

关于java - 用于自动化测试的嵌入式 jetty ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20606283/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com