【问题标题】:Integration testing of JAX-RS servicesJAX-RS 服务的集成测试
【发布时间】:2018-05-07 16:21:57
【问题描述】:

我最近实现了简单的 JAX-RS REST 端点。我想知道是否有任何透明的集成测试方式?

我在stackowerflow上搜索了一下,发现了这些问题:firstsecond。它们有点过时了,我希望已经有一些更好的测试方法。那里提出的解决方案并不能解决我的问题,因为它们提供了特定于供应商的方式或一些复杂的第三方方式。

问:测试 JAX-RS 服务的现代方法是什么? Java EE 是否为此提供了解决方案?或者一般来说,在 Java EE 生态系统中编写控制器测试的最佳方式是什么?

更具体地说,我正在寻找一种可以轻松测试 REST 调用的方法。在spring框架中通常是这样的:

@Autowired
MockMvc mvc;
@MockBean
MyService service;

@Test
public void shouldGetMyDto() {
    MyDto dto = new MyDto("test-id", "test-name");
    given(service.getMyDto("test-id")).willReturn(dto);

    mvc.perform(get("/api/my-entities/test-id"))
            .andExpect(status().isOk())
            .andExpect(content().contentType(APPLICATION_JSON_UTF8_VALUE))
            .andExpect(jsonPath("$.id", is("test-id")))
            .andExpect(jsonPath("$.name", is("test-name")));

    verify(service).getMyDto("test-id");
}

【问题讨论】:

  • 你说的是单元测试还是集成测试?您的示例是单元测试。 jaxrs-people 有一个纯 JavaEE JAX-RS 集成测试的示例。
  • @SteveC 感谢您的提示,我将使用它进行端到端测试。但这不是我现在要寻找的。在您的示例中,您建立了我不需要的功能齐全的应用程序运行。我只需要检查 JAX-RS 是否已正确集成,这意味着我需要检查 DTO 是否被转换为正确的 json,是否返回了正确的内容类型,状态代码是否正常,并且正在调用正确的服务方法。当然,在这种情况下我不需要完全建立的服务 - 所以我想以某种方式模拟它。这就是我要找的。​​span>
  • 您使用哪些 DI 和 REST 框架?
  • @Justas 我刚刚生成了默认的 Wildfly Swarm 项目。我猜它使用 Weld 作为 CDI 容器和 RESTEasy。

标签: java rest jakarta-ee junit jax-rs


【解决方案1】:

Arquillian 和 CDI 替代品

对于 Java EE,您可以使用 Arquillian 为您的测试创建微部署,允许您选择要部署的类。您可以使用CDI alternatives 为您的服务提供模拟实现。

要将 Maven 依赖项添加到 Arquillian 部署,请参阅此 answer

JAX-RS 客户端 API 和 REST 保证

要测试 REST API 本身,您可以依赖 JAX-RS 2.0 中引入的 JAX-RS Client API

如果您更喜欢类似于 Spring 提供的流畅 API,请选择 REST Assured

探索其他方法

根据您对测试的需求,您还可以探索其他不使用 Java 的解决方案。

例如,Postman 允许您编写 test scripts。它还提供了Newman,用于使用 Node.js 从命令行运行集合。

【讨论】:

  • Here 是使用 JAX-RS 客户端 API 对 Arquillian 进行的一些测试示例。
  • Here 是一些使用 Spring Boot 和 REST Assured 的示例。我知道你不想使用 Spring,但看看测试是什么样子的。您可以使用 Arquillian 轻松部署应用程序,然后使用 REST Assured 定位它。
  • 谢谢。我刚刚查看了您第一条评论中的示例。看起来这就是我需要的。但是您不会在GreetingResourceTest 中模拟服务,因此它可能会加载完整的上下文。是否可以注入模拟而不是GreetingService?我想单独测试与其余相关的代码。是否也可以单独加载一个端点?假设在不加载类似资源的情况下加载 GreetingResource。我还想跳过加载我的具体资源中不需要的 CDI bean。这可能吗?
  • @OleksandrShpota 是的,这一切都可以通过 Arquillian 和 CDI 实现。 Arquillian 允许您选择要部署的类。您可以使用 CDI 替代方案为您的服务提供模拟实现。
猜你喜欢
  • 2023-03-10
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 2016-05-07
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
相关资源
最近更新 更多