这个问题是上一个问题 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/