java - 使用 jersey-spring3 从 JerseyTest 容器中检索托管 bean

标签 java spring unit-testing jersey-2.0

这个问题是上一个问题 Specify Custom Application Context 的后续问题.

我们正在将一些数据服务从使用 jersey-spring 的 Jersey 1.x 迁移到使用 jersey-spring3 的 Jersey 2.x。

我们有几个继承自 JerseyTest 的测试类。其中一些类使用未在 web.xml 文件中指定的自定义 applicationContext.xml 文件。

出于对象模拟的目的,我们将模拟 Jersey 资源中的一些组件。

在 Jersey 1.x 中,我们可以通过以下方式模拟应用程序上下文文件中的对象

<bean id="mockBean" class="org.easymock.EasyMock" 
    factory-method="createStrictMock" autowire="byName">
    <constructor-arg index="0" value="com.xxx.xxx.ClassToMock" /> 
</bean>

并按如下方式检索这些模拟实例

ClassToMock obj = (ClassToMock)ContextLoader
    .getCurrentWebApplicationContext()
    .getAutowireCapableBeanFactory()
    .getBean("mockBean");

如何使用 jersey-spring3 在 Jersey 2.x 中实现同样的效果?

我梳理了API docs , user guides和一些 sources但无法找到答案。

谢谢。

编辑:

我们将在 JAX-RS 资源中使用模拟 bean。我们的资源中有 @Autowired 服务接口(interface)。

例如

@Path(ProductResource.RESOURCE_PATH)
@Component
@Scope("prototype")
public class ProductResource 
extends GenericResource<Product, BaseModel> {

    /*
     * Members
     */

    public static final String RESOURCE_PATH = "product/";

    @Autowired
    protected ProductService productService;

    ...

我们想模拟这些服务并设定对这些服务的期望。

例如

<bean id="productService" class="org.easymock.EasyMock" 
    factory-method="createStrictMock">
    <constructor-arg index="0" 
        value="com.xxx.xxx.service.ProductService" /> 
</bean>

最佳答案

注意:我不是 Spring 专家,我认为这是一种解决方法,而不是推荐的方法。希望有人能提出更好的解决方案。

您无法通过调用 ContextLoader#getCurrentWebApplicationContext() 获取 ApplicationContext 实例,因为在使用 Jersey 时,Jersey 2.x 运行时默认在 Servlet 容器之外初始化用于单元/e2e 测试的测试框架 (JerseyTest)。

在这种情况下,您需要使用一些变通方法来通过实现 ApplicationContextAware 来获取 ApplicationContext测试包中的接口(interface):

public class ApplicationContextUtils implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

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

一旦你有了这个类,不要忘记在你的应用程序上下文描述符中提及它:

...
<bean class="org.glassfish.jersey.examples.helloworld.spring.ApplicationContextUtils" />
...

您可以在测试中使用它:

public class JerseySpringResourceTest extends JerseyTest {

    // ... Configure ...

    @Before
    public void mockUp() throws Exception {
        // ApplicationContext is ready in your @Before methods ...
        assertThat(ApplicationContextUtils.getApplicationContext(), notNullValue());
    }

    @Test
    public void testJerseyResource() {
        // ... as well as in your test methods.
        assertThat(ApplicationContextUtils.getApplicationContext(), notNullValue());
    }
}

注意:如果您想将应用程序部署到 Servlet 容器并针对它运行您的 (JerseyTest) 测试,请咨询 Jersey Test Framework用户指南中的章节(尤其是 External container 部分)。

关于java - 使用 jersey-spring3 从 JerseyTest 容器中检索托管 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18282409/

相关文章:

java - 添加边框并更改字体大小 - docx4j

java - 使用 Web 服务时出现 UnKnowHost 异常

java - 流<字符串> 到映射<字符串、整数>

java - 如何在 Spring IoC XML 配置中从 web.xml 获取显示名称

iPhone单元测试设置问题

java - 尝试理解存储 stringAt()

java - 从 cron 运行 Spring Boot 应用程序

java - FreeMarker Spring MVC 导入问题

asp.net - 如何对等待另一个异步任务的 AsyncTask 进行单元测试?

python - 类型错误 : issubclass() arg 1 must be a class in Django tests