如何为 REST Web 服务创建 JUnit 测试?

新手上路,请多包涵

我是 JUnit 的初学者。我想创建一个测试以获取所有 product s 并通过 id --- 获取 product s。这是我的 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);
    }
}

原文由 CooperShelly 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 609
2 个回答

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

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

这样做可能需要模拟环境,在您的情况下,您可能需要模拟从中获取的任何 Produit

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

有很多库可以帮助您编写 RESTful 资源的实际测试, 放心 是一个好的库。

原文由 kaqqao 发布,翻译遵循 CC BY-SA 4.0 许可协议

正如kaqqao提到的,你可以简单地实例化 ProduitResource 并测试它,但在这种情况下你将无法进行HTTP调用,检查HTTP状态。 REST Assured 适用于测试 REST 服务,但问题是您需要将其作为单独的实例运行,这并不方便 - RestAssured 测试无需运行 Tomcat 。另一种选择是使用 Jersey 测试( 如何在内存中单元测试 Spring-Jersey ),它提供了在内存中测试 REST 服务的能力。

原文由 Justinas Jakavonis 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题