gpt4 book ai didi

java - Jersey 测试框架和 HK2-Guice 桥

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

有基于 Jersey 2.23.2 和 Guice 3.0 的 REST Web 服务。要使用Guice,需要调整hk2-guice bridge (我使用的是 2.5.0-b07)。一切正常,直到我尝试使用 Jersey Test Framework 测试服务。 。无法配置 hk2-guice 桥接器进行测试。

我的测试:

public class SomeTest extends JerseyTestNg.ContainerPerClassTest {

@Override
protected TestContainerFactory getTestContainerFactory() throws TestContainerException {
return new GrizzlyWebTestContainerFactory();
}

@Override
protected Application configure() {
return super.configure(); // cant't configure
}

@Test
public void test() {
Assert.assertEquals(1, 1);
}
}

我无法在 SomeTest.configure() 中配置测试,只返回 new JerseyConfiguration() (见下文),因为 JerseyConfiguration 的构造函数需要 ServiceLocator 的对象。

即使可以返回 `JerseyConfiguration` 类的对象 - 我也不确定我的测试是否有效,因为 web.xml 文件中定义了一些过滤器和监听器。

如何配置考虑所有过滤器、监听器和hk2-guice桥的测试?

<小时/>

网络服务详细信息

build.gradle 中的依赖项部分:

def jerseyVersion = '2.23.2'
def hk2Version = '2.5.0-b07'
def giuceVersion = '3.0'

dependencies {
compile "javax.servlet:javax.servlet-api:3.1.0"
//jersey
compile "org.glassfish.jersey.core:jersey-server:${jerseyVersion}"
compile "org.glassfish.jersey.containers:jersey-container-servlet:${jerseyVersion}"
//hk2
compile "org.glassfish.hk2:guice-bridge:${hk2Version}"
//guice
compile "com.google.inject:guice:${giuceVersion}"
compile "com.google.inject.extensions:guice-servlet:${giuceVersion}"
}

文件 web.xml:

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

<display-name>REST API App</display-name>

<listener>
<listener-class>com.example.core.JerseyGuiceServletContextListener</listener-class>
</listener>

<filter>
<filter-name>guiceFilter</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>guiceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
<filter-name>jerseyFilter</filter-name>
<filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.example.core.JerseyConfiguration</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>jerseyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>

JerseyGuiceServletContextListener 类:

public class JerseyGuiceServletContextListener extends GuiceServletContextListener {
static Injector injector;

@Override
protected Injector getInjector() {
injector = Guice.createInjector(new JerseyServletModuleConfig());
return injector;
}
}

JerseyServletModuleConfig 类:

class JerseyServletModuleConfig extends ServletModule {
@Override
protected void configureServlets() {
bind(HeyResource.class).in(Scopes.SINGLETON);
}
}

JerseyConfiguration 类:

package com.example.core;

import com.google.inject.Injector;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.jersey.server.ResourceConfig;
import org.jvnet.hk2.guice.bridge.api.GuiceBridge;
import org.jvnet.hk2.guice.bridge.api.GuiceIntoHK2Bridge;

import javax.inject.Inject;
import javax.servlet.ServletContext;

class JerseyConfiguration extends ResourceConfig {
@Inject
public JerseyConfiguration(ServiceLocator serviceLocator, ServletContext servletContext) {
packages("com.example.ws");
GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
guiceBridge.bridgeGuiceInjector(JerseyGuiceServletContextListener.injector);
}
}

最佳答案

刚刚覆盖了 configureDeployment() 并修改了测试中的 configure() 方法

public class SomeTest extends JerseyTestNg.ContainerPerClassTest {

@Override
protected TestContainerFactory getTestContainerFactory() throws TestContainerException {
return new GrizzlyWebTestContainerFactory();
}

@Override
protected Application configure() {
return new ResourceConfig()
.packages("com.example.ws")
.register(GensonCustomResolver.class);
}

@Override
protected DeploymentContext configureDeployment() {
Application application = configure();

return ServletDeploymentContext.builder(application)
.addListener(JerseyGuiceServletContextListener.class)
.addFilter(GuiceFilter.class, "guiceFilter")
.addFilter(ServletContainer.class, "jerseyFilter", new HashMap<String, String>(){{
put("javax.ws.rs.Application", JerseyConfiguration.class.getCanonicalName());
}})
.build();
}

@Test
public void test() {
Assert.assertEquals(1, 1);
}
}

& 添加 web.xml 到测试类路径。

关于java - Jersey 测试框架和 HK2-Guice 桥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39225187/

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