我正在从事一个用Jersey 2(用于RESTAPI)和Spring(用于DI)实现的REST项目,我想编写功能/集成测试。我尝试使用JerseyTest框架并使用真实的数据库进行这些测试。我唯一想模拟的是我的应用程序使用的远程Web服务(SOAP),为此我应该模拟生成的WS客户端。
在花了大量时间研究Jersey2和Spring的JerseyTest框架之后,似乎不可能为集成测试设置该框架。你能告诉我你成功设置了类似的东西吗?
JerseyTest的问题是AFAIK,我不能使用web.xml配置文件中的所有设置,例如注册多个过滤器和servlet,并且我不能使用我为在测试下运行的应用程序配置的相同Spring上下文来定义模拟对象以及它们每次测试返回的内容。我的每个REST资源都受到Spring Security保护,它也没有加载JerseyTest框架,因为需要注册它的侦听器。
请给出一些建议,如何实现这一点,或者可能使用另一个测试框架来实现上述所有内容。。。
下面是我的junit测试代码:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {MyResourceTest.MOCK_SPRING_APPLICATION_CONTEXT})
public class MyResourceTest extends JerseyTest {
public static final String MOCK_SPRING_APPLICATION_CONTEXT = "classpath:spring/testApplicationContext.xml";
@Override
protected Application configure() {
ResourceConfig resourceConfig = new MyResourceConfig();
disable(TestProperties.LOG_TRAFFIC);
disable(TestProperties.DUMP_ENTITY);
resourceConfig.property("contextConfigLocation", MOCK_SPRING_APPLICATION_CONTEXT);
return resourceConfig;
}
@Override
protected TestContainerFactory getTestContainerFactory() {
return new GrizzlyWebTestContainerFactory();
}
@Override
protected DeploymentContext configureDeployment() {
return ServletDeploymentContext
.forServlet(new ServletContainer(new MyResourceConfig()))
.addListener(MyContextLoaderListener.class) // Extends Spring's listener
.addListener(RequestContextListener.class)
.contextParam("contextConfigLocation", MOCK_SPRING_APPLICATION_CONTEXT)
.build();
}
@Test
@SqlGroup({
@Sql(scripts = {"classpath:db_scripts/clean-up.sql", "classpath:db_scripts/init-db.sql"}),
@Sql(scripts = "classpath:db_scripts/clean-up.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
})
public void shouldReceiveResourceTest() throws IOException {
// Prepare request ...
final MyResponse myResponse = target("/resource/1").request().post(myRequest, MyResponse.class);
assertNotNull(myResponse);
}
}
您已经回退到Spring Boot选项,但是,让我与您分享我是如何在没有Spring Boot的情况下成功地进行集成测试的。
最棘手的部分是注册web内容。xml,为了做到这一点,您需要按如下方式设置服务器
怎么做到的?
@Before
public void setUp() throws Exception {
if (server == null) {
final ResourceConfig rc = new ResourceConfig(A.class, B.class);
WebappContext ctx = new WebappContext() {};
ctx.addContextInitParameter("contextConfigLocation", "classpath:applicationContext.xml");
ctx.addListener("com.package.something.AServletContextListener");
server = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
ctx.deploy(server);
}
}
在我的网站上。xml I重写了ContextListener,因此有以下几行
ctx.addListener("...");
以类似的方式,您可以以编程方式创建一个WebappContext,它只不过是您的web.xml.它的工作原理就像一个魅力。
我已经回答了一个类似的问题,如果你想知道更多细节,这里是答案的链接。
问题内容: 我的问题是:为什么在创建部署在某种servlet容器(如jetty或tomcat)上的应用程序时执行JavaSE应用程序和ServletModule时需要创建AbstractModule?它们之间有什么区别? 我需要将Jersey与Guice集成在一起。是否需要注册Guice的存在才能以某种方式使用它?我是否可以仅启用注入并在我想要的任何地方(常规类,过滤器,处理程序,服务,DAO等)
我在泽西(从文档中)创建了这个测试,它运行良好,但有一个问题:没有被调用。 我需要测试的资源类依赖于ServletContextListener在ServletContext上设置的属性。 我可以确保它被调用吗,或者我可以用其他方式操纵ServletContext吗? 我添加了这些依赖项来实现这一点:
我有一个有点困难的情况。我正在使用泽西提供REST服务。 在我的运行时中,我使用版本1.16.0执行此操作: 这是我的资源类: 这是有效的,我得到了预期的json响应。 现在我找到了一个为集成测试提供内存服务器的杰西测试框架。 不幸的是,这似乎只适用于泽西2。x、 所以我为我的测试添加了一个额外的梯度设置: 这是我的测试课: 只要我的资源返回字符串,这个设置就可以运行。但是,只要我返回一个响应,如
我试图在Jersey测试类中注入一个由HK2工厂服务提供的对象,但得到未满足的依赖项异常。 MultiException有3个异常。它们是: org.glassfish.hk2.api.unsatifiedDependencyException:在SystemInjecteeImpl(requiredtype=closeableService,parent=TestFactory,qualifie
英文原文:http://emberjs.com/guides/testing/integration/ 集成测试通常用来测试应用中得重要工作流。集成测试用来模拟用户交互和确认交互结果。 设置 为了对Ember应用进行集成测试,需要在测试框架中运行应用。首先需要将根元素(root element)设置为任意一个已知将存在的元素。如果根元素在测试运行时可见的话,这对测试驱动开发非常有用,带来的帮助非常
我正在使用Jersey编写REST web服务,并尝试编写一组单元测试,以使用Jersey测试框架测试该服务。 然而,我使用HTTP身份验证和SecurityContext作为我的web服务的一部分,我在设置JTF以允许我测试这些方面时遇到了问题。我可以在请求中发送身份验证信息,但如何配置它以了解我希望设置的不同角色和用户? 我目前正在使用Jetty(通过JettyTestContainerFac