1
resposta

Escrevendo teste para verificar a função alteraProduto

Como nos últimos capítulos, o curso quis terminar mais rápido não passando os exercícios para treinar os conceitos. Eu fui tentar, sem sucesso, criar um teste para a função alteraProduto. Eu gostaria de passar no POST um objeto Carrinho e um objeto Produto, mas não sei fazer o mesmo. Como seria feito?

    @Path("trocaquantidade/")
    @PUT
    @Consumes(MediaType.APPLICATION_XML)
    public Response alteraProduto(Carrinho carrinho, Produto produto) {
        carrinho.trocaQuantidade(produto);
        return Response.ok().build();
    }
   @Test
    public void testaAlteraQuantidade() {
        WebTarget target = client.target("http://localhost:8080");
        Carrinho carrinho = new Carrinho();
        Produto produto = new Produto(314L, "Caixa", 999, 4);
        carrinho.adiciona(produto);
        carrinho.setRua("Rua Vergueiro");
        carrinho.setCidade("Sao Paulo");
        Entity<Carrinho> entity = Entity.entity(carrinho, MediaType.APPLICATION_XML);
        Response response = target.path("/carrinhos").request().post(entity);
        Assert.assertEquals(201, response.getStatus());
        if (response.getStatus() == 201) {
            String location = response.getHeaderString("Location");
            Carrinho carrinhoCarregado = client.target(location).request().get(Carrinho.class);
            Assert.assertEquals("Microfone", carrinhoCarregado.getProdutos().get(0).getNome());
            produto.setQuantidade(2);
            --->Entity<Carrinho, Produto> entityEnvio = Entity.entity(produto, MediaType.APPLICATION_XML);<---
            Response responseTroca = target.path("/trocaquantidade").request().post(entityEnvio);
            Assert.assertEquals(200, responseTroca.getStatus());
        }
    }
1 resposta

Olá Danielson, tudo bem?

No seu teste você está utilizando o método POST para enviar o objeto Carrinho para o endpoint "/carrinhos". Porém, para testar a função alteraProduto, você precisa utilizar o método PUT (visto que está anotado com @PUT) e enviar tanto o objeto Carrinho quanto o objeto Produto.

Aqui está um exemplo de como você pode fazer isso:

@Test
public void testaAlteraQuantidade() {
    WebTarget target = client.target("http://localhost:8080");
    Carrinho carrinho = new Carrinho();
    Produto produto = new Produto(314L, "Caixa", 999, 4);
    carrinho.adiciona(produto);
    carrinho.setRua("Rua Vergueiro");
    carrinho.setCidade("Sao Paulo");
    Entity<Carrinho> entityCarrinho = Entity.entity(carrinho, MediaType.APPLICATION_XML);
    Response responseCarrinho = target.path("/carrinhos").request().post(entityCarrinho);
    Assert.assertEquals(201, responseCarrinho.getStatus());
    if (responseCarrinho.getStatus() == 201) {
        String location = responseCarrinho.getHeaderString("Location");
        Carrinho carrinhoCarregado = client.target(location).request().get(Carrinho.class);
        Assert.assertEquals("Microfone", carrinhoCarregado.getProdutos().get(0).getNome());
        
        produto.setQuantidade(2);
        Entity<Produto> entityProduto = Entity.entity(produto, MediaType.APPLICATION_XML);
        Response responseTroca = target.path("/trocaquantidade").request().put(entityProduto);
        Assert.assertEquals(200, responseTroca.getStatus());
    }
}

No exemplo acima, criamos uma nova entidade Entity<Produto> para enviar o objeto Produto no método PUT. Certifique-se de que o endpoint "/trocaquantidade" esteja configurado corretamente para receber uma requisição PUT.

Espero ter ajudado e bons estudos!