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章节.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...