这个问题是从上一个问题
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章节.