这个问题是从上一个问题
Specify Custom Application Context中得出的.
@H_403_37@解决方法
我们正在使用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章节.