当前位置: 首页 > 知识库问答 >
问题:

泽西2 Spring集成测试设置

华昕
2023-03-14

我正在从事一个用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);
    }

}

共有2个答案

莘康裕
2023-03-14

您已经回退到Spring Boot选项,但是,让我与您分享我是如何在没有Spring Boot的情况下成功地进行集成测试的。

最棘手的部分是注册web内容。xml,为了做到这一点,您需要按如下方式设置服务器

  1. 使用@Before和if条件确保为整个测试类设置一次容器,这样spring就不必为每个测试自动连接bean
  2. 以编程方式创建WebappContext并注册web中的所有内容。xml,然后使用其部署方法向其传递一个服务器实例(即Grizzly等)

怎么做到的?

@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.它的工作原理就像一个魅力。

我已经回答了一个类似的问题,如果你想知道更多细节,这里是答案的链接。

宋俊民
2023-03-14

也许我的解决方案示例可以解决您的问题。我在GitHub上托管了它:

将JerseyTest与Spring集成的更好方法

  • junit测试类中没有从JerseyTest继承
 类似资料:
  • 问题内容: 我的问题是:为什么在创建部署在某种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