我想使用JerseyTest测试资源。我已创建了以下测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:testApplicationContext.xml")
public class ResourceTest extends JerseyTest
{
@Configuration
public static class Config
{
@Bean
public AObject aObject()
{
return mock(AObject.class);
}
}
@Autowired
public AObject _aObject;
@Test
public void testResource()
{
// configouring mock _aObject
Response response = target("path");
Assert.assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
}
@Override
protected Application configure()
{
return new ResourceConfig(Resource.class).property("contextConfigLocation", "classpath:testApplicationContext.xml");
}
}
我的资源也有一个带有@Autowired
注解的AObject引用。
我的问题是我的JerseyTest
和Resource
(由测试配置的)有不同的Mock对象示例。在控制台中,我看到testApplicationContext.xml
被加载了两次,一次用于测试,一次用于资源。
我怎么能强迫泽使用同样的嘲弄呢?
4条答案
按热度按时间fzwojiic1#
在调试jersey-spring 3(版本2.9.1)库之后,问题似乎出在SpringComponentProvider中。createSpringContext
它检查应用程序属性中是否存在名为“contextConfig”的属性,如果不存在,它将初始化spring应用程序上下文。即使您在测试中初始化了spring应用程序上下文,jersey也会创建另一个上下文并使用该上下文。因此,我们必须以某种方式将测试中的ApplicationContext传递到Jersey Application类中。解决方案如下:
上面的类将从我们的测试中获取应用程序上下文,并将其传递给已配置的ResourceConfig,以便SpringComponentProvider将相同的应用程序上下文返回给jersey。我们还使用jersey-spring-applicationContext.xml,以便包含jersey特定的Spring配置。
现在,您可以使用此基类创建测试,例如
在testContext.xml中添加以下定义,以便注入模拟AObject。
pdkcd3nj2#
我无法从@Grigoris的工作中得到答案https://stackoverflow.com/a/24512682/156477,尽管他对为什么会发生这种情况的解释是正确的。
最后,我选择了下面的方法,它公开了一个特殊的setter来插入mock对象。虽然不像上面的方法那样“干净”,但值得一试,它公开了我想模拟的apiProvider,这样我就可以编写一些测试了。
gfttwv5a3#
如果有人对Kevin为Jersey v1提供的https://stackoverflow.com/a/40591082/4894900解决方案感兴趣:
ekqde3dh4#
通过删除xml依赖性进一步改进可接受的解决方案。更多详细信息here。
泽西Spring测试抽象泽西测试:
包含测试的示例资源: