微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 使用jersey-spring3从JerseyTest容器中检索受管Bean

这个问题是从上一个问题 Specify Custom Application Context中得出的.

我们正在使用jersey-spring将泽西1.x的一些数据服务从泽西春天迁移到泽西2.x.

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

为了嘲笑目标,我们会嘲笑我们泽西资源部分的一些组件.

在泽西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");

如何使用泽西 – 春季3?

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

谢谢.

编辑:

我们将使用JAX-RS资源内的嘲弄bean.我们拥有@Autowired到我们的资源的服务接口.

例如

@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>

解决方法

注意:我不是春季专家,我认为这是一个比推荐方法更有效的方法.希望有人会想出一个更好的解决方案.

您不能通过调用ContextLoader#getCurrentWebApplicationContext()获取一个ApplicationContext实例,因为当使用Jersey Test Framework(JerseyTest)进行单元/ e2e测试时,认情况下,在Servlet容器之外认使用Jersey 2.x运行时.

在这种情况下,您需要使用一些解决方法获取ApplicationContext,方法是在测试包中实现一个ApplicationContextAware接口:

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)测试,请参阅“用户指南”(特别是External container部分)中的Jersey Test Framework章节.

原文地址:https://www.jb51.cc/java/120635.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐