【问题标题】:How to create a JUnit test for REST web service?如何为 REST Web 服务创建 JUnit 测试?
【发布时间】:2017-01-23 14:32:42
【问题描述】:

我是 JUnit 的初学者。 我想创建一个测试来获取所有products 并通过id 获取products。 这是我的 Java 代码:

@Path("/produits")
@Produces("application/json")
public class ProduitResource {

    public ProduitResource() {
    }

    @GET
    public List<Produit> getProduits() {
        System.out.println("getProduits");

        return ReadXMLFile.getProduits();
    }

    @GET
    @Path("numProduit-{id}")
    public Produit getProduit(@PathParam("id") String numProduit) {
        System.out.println("getProduit");

        for (Produit current : ReadXMLFile.getProduits()) {
            if (numProduit.equals(current.getNumProduit())) {
                return current;
            }
        }
        return null;
    }

    @GET
    @Path("/search")
    public List<Produit> searchProduitsByCriteria(@QueryParam("departure") String departure, @QueryParam("arrival") String arrival, @QueryParam("arrivalhour") String arrivalHour) {
        System.out.println("searchProduitsByCriteria");

        return ReadXMLFile.getProduits().subList(0, 2);
    }
}

【问题讨论】:

  • 你有什么尝试吗?
  • @OliverCharlesworth,还没有,我在等一个例子。

标签: java web-services rest testing junit


【解决方案1】:

假设您想要进行单元测试,而不是集成、功能或其他类型的测试,您应该简单地实例化 ProduitResource 并在其上运行测试:

@Test
public void testFetchingById() {
   ProduitResource repo = new ProduitResource();
   Produit prod = repo.getProduit("prod123");
   assertNotNull(prod);
   assertEquals(prod.getId(), "prod123");
}

执行此操作可能需要模拟环境,在您的情况下,您可能需要模拟从中获取 Produits 的任何内容。

如果您要实际触发 HTTP 请求,这将需要运行服务器并且不再构成单元测试(因为您要测试的不仅仅是该单元自身的功能)。为此,您可以让构建工具在运行测试之前启动服务器(例如,Jetty Maven plugin 可用于在pre-integration-test 阶段启动 Jetty),或者您可以让 JUnit 在准备步骤中执行此操作(@ 987654328@) 如here 所述。关闭服务器的类似逻辑(在 Maven 中使用 post-integration-test 阶段或在 JUnit 中使用 @AfterClass)。

有许多库可以帮助您编写 RESTful 资源的实际测试,rest-assured 是一个不错的库。

【讨论】:

    【解决方案2】:

    正如kaqqao 所说,您可以简单地实例化ProduitResource 并对其进行测试,但在这种情况下您将无法进行HTTP 调用,请检查HTTP 状态。 REST Assured 适合测试 REST 服务,但问题是您需要将其作为单独的实例运行,这不方便 - RestAssured testing without running Tomcat。另一种选择是使用 Jersey Test (How to in-memory unit test Spring-Jersey),它提供了在内存中测试 REST 服务的能力。

    【讨论】:

      【解决方案3】:

      您可以使用两种基本策略(您可能希望同时使用这两种策略)。

      1. 重新设计 Web 服务的代码,以便您可以模拟与环境交互的任何对象的依赖关系,例如示例中的 ReadXMLFile。模拟对象将返回预设数据,而不是读取任何文件或数据库。使用 Mockito 等模拟框架可以减少创建模拟对象的工作量。然后,您可以在 JUnit 测试中实例化 ProductResource 类,并像任何其他 Java 代码一样调用它。

      2. 创建 JUnit 设置和拆除方法(使用 @Before、@BeforeClass、@After 和 @AfterClass 注释),这些方法将设置测试环境、种子数据、部署应用程序并在以下情况下清理它测试结束了。然后使用 REST 客户端 API(例如 Jersey 客户端 API 或 Spring RestTemplate)调用您的 Web 服务并获取结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-13
        相关资源
        最近更新 更多