Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Erro ao tentar deletar usuario

Nao estou conseguindo DELETAR usuario logo apos conseguir cadastrar novo usuario no teste abaixo:

@Test
    public void deveAdicionarUmUsuario(){

        Usuario joao = new Usuario("Joao da Silva", "joao@dasilva.com");

        XmlPath path = given()
                          .header("Accept", "application/xml")
                          .contentType("application/xml")
                          .body(joao)        // por ele saber qual o contentType, ele serializa 'joao' em XML e/ou JSON
                      .expect()
                            .statusCode(200) // status code esperado (200 OK)
                      .when()
                            .post("/usuarios")
                      .andReturn()
                            .xmlPath();

        Usuario resposta = path.getObject("usuario", Usuario.class);

        System.out.println(resposta.getId());

        assertEquals("Joao da Silva", resposta.getNome());
        assertEquals("joao@dasilva.com", resposta.getEmail());

        String resultadoDelete = given()
                                    .header("Accept", "application/xml")
                                    .contentType("application/xml")
                                    .param("usuario.id", resposta)
                                    .body(resposta)
                                .expect()
                                    .statusCode(200)
                                .when()
                                    .delete("/usuarios/deleta")
                                .andReturn()
                                    .asString();
        System.out.println("resultadoDelete: " + resultadoDelete);
        assertEquals(200, resultadoDelete);

    }

Percebi que quando cadastro novo Usuario na URL '/usuarios' o ID gerardo para esse novo usuario e um numero muito grande, eis o resultado da minha consultar (http://localhost:8080/usuarios?_format=xml):

<list>
<usuario>
<id>1</id>
<nome>Mauricio Aniche</nome>
<email>mauricio.aniche@caelum.com.br</email>
</usuario>
<usuario>
<id>2</id>
<nome>Guilherme Silveira</nome>
<email>guilherme.silveira@caelum.com.br</email>
</usuario>
<usuario>
<id>7999972134793959925</id>
<nome>Joao da Silva</nome>
<email>joao@dasilva.com</email>
</usuario>
<usuario>
<id>288455191298234802</id>
<nome>Joao da Silva</nome>
<email>joao@dasilva.com</email>
</usuario>
<usuario>
<id>4487694038266806244</id>
<nome>Joao da Silva</nome>
<email>joao@dasilva.com</email>
</usuario>
<usuario>
<id>8151050900880893222</id>
<nome>Joao da Silva</nome>
<email>joao@dasilva.com</email>
</usuario>
<usuario>
<id>2736652655720427300</id>
<nome>Joao da Silva</nome>
<email>joao@dasilva.com</email>
</usuario>
</list>

Nem consigo pesquisar usuario pelo ID dele com esse numero, ao pesquisar os usuarios cadastrados com numeros 1 e 2, funciona:

http://localhost:8080/usuarios/show?usuario.id=1&_format=xml

Retorna:

<usuario>
<id>1</id>
<nome>Mauricio Aniche</nome>
<email>mauricio.aniche@caelum.com.br</email>
</usuario>

Mas o tentar pesquisar o usuario com esse ID grande, exemplo com o ID : 8151050900880893222 (http://localhost:8080/usuarios/show?usuario.id=288455191298234802&_format=xml), o resultado e:

HTTP ERROR: 404

NOT_FOUND
RequestURI=/usuarios/show

Powered by Jetty://

Nao estou sabendo trabalhar com o metodo delete.

Atenciosamente,

Renato Ramos

8 respostas

Oi Renato, você consegue dar uma debugada no método que cria o usuário? esse id realmente ta estranho... o delete em si não tem nada de especial, é apenas mais um verbo que sua aplicação pode lidar e, geralmente, está associado com o ato de remover algo do servidor.

Ola Alberto,

Olha como esta sendo mostrado meu XML na URL http://localhost:8080/usuarios?_format=xml:

This XML file does not appear to have any style information associated with it. The document tree is shown below.


<list>
<usuario>
<id>1</id>
<nome>Mauricio Aniche</nome>
<email>mauricio.aniche@caelum.com.br</email>
</usuario>
<usuario>
<id>2</id>
<nome>Guilherme Silveira</nome>
<email>guilherme.silveira@caelum.com.br</email>
</usuario>
<usuario>
<id>7999972134793959925</id>
<nome>Joao da Silva</nome>
<email>joao@dasilva.com</email>
</usuario>
<usuario>
<id>288455191298234802</id>
<nome>Joao da Silva</nome>
<email>joao@dasilva.com</email>
</usuario>
<usuario>
<id>4487694038266806244</id>
<nome>Joao da Silva</nome>
<email>joao@dasilva.com</email>
</usuario>
<usuario>
<id>8151050900880893222</id>
<nome>Joao da Silva</nome>
<email>joao@dasilva.com</email>
</usuario>
<usuario>
<id>2736652655720427300</id>
<nome>Joao da Silva</nome>
<email>joao@dasilva.com</email>
</usuario>
<usuario>
<id>2833792219379781055</id>
<nome>Joao da Silva</nome>
<email>joao@dasilva.com</email>
</usuario>
<usuario>
<id>2266532097333196246</id>
<nome>Joao da Silva</nome>
<email>joao@dasilva.com</email>
</usuario>
<usuario>
<id>5382676388002811563</id>
<nome>Joao da Silva</nome>
<email>joao@dasilva.com</email>
</usuario>
<usuario>
<id>270872312523556672</id>
<nome>Joao da Silva</nome>
<email>joao@dasilva.com</email>
</usuario>
<usuario>
<id>3668122913573931516</id>
<nome>Joao da Silva</nome>
<email>joao@dasilva.com</email>
</usuario>
<usuario>
<id>537053417133977077</id>
<nome>Joao da Silva</nome>
<email>joao@dasilva.com</email>
</usuario>
<usuario>
<id>8280928982374606412</id>
<nome>Joao da Silva</nome>
<email>joao@dasilva.com</email>
</usuario>
<usuario>
<id>7461968919909145687</id>
<nome>Joao da Silva</nome>
<email>joao@dasilva.com</email>
</usuario>
<usuario>
<id>2238053196424385564</id>
<nome>Joao da Silva</nome>
<email>joao@dasilva.com</email>
</usuario>
<usuario>
<id>1424673640849745031</id>
<nome>Joao da Silva</nome>
<email>joao@dasilva.com</email>
</usuario>
</list>

Veja que os dois primeiros usuarios de IDs 1 e 2 estao transquilos, mas os outros fora criados com o teste:

@Test
    public void deveAdicionarUmUsuario(){

        Usuario joao = new Usuario("Joao da Silva", "joao@dasilva.com");

        XmlPath path = given()
                          .header("Accept", "application/xml")
                          .contentType("application/xml")
                          .body(joao)        // por ele saber qual o contentType, ele serializa 'joao' em XML e/ou JSON
                      .expect()
                            .statusCode(200) // status code esperado (200 OK)
                      .when()
                            .post("/usuarios")
                      .andReturn()
                            .xmlPath();

        Usuario resposta = path.getObject("usuario", Usuario.class);

        System.out.println(resposta.getId());

        assertEquals("Joao da Silva", resposta.getNome());
        assertEquals("joao@dasilva.com", resposta.getEmail());

        String resultadoDelete = given()
                                    .header("Accept", "application/xml")
                                    .contentType("application/xml")
                                    .param("usuario.id", resposta)
                                    .body(resposta)
                                .expect()
                                    .statusCode(200)
                                .when()
                                    .delete("/usuarios/deleta")
                                .andReturn()
                                    .asString();
        System.out.println("resultadoDelete: " + resultadoDelete);
        assertEquals(200, resultadoDelete);

    }

Na verdade eu nem consigo retornar a referencia do Objeto  Usuario com esses IDs grandes.

Renato Olá!

To vendo seu código aqui na parte de delete o método .param("usuario.id", resposta) parece ser aqui um problema, coloca resposta.getId(), vê se ajuda

Estou enfrentando o mesmo problema. Tentei uma variação, para limpar os objetos duplicados.

@Test
    public void limpaUsuariosDuplicados() {
        Usuario joao = new Usuario("Joao da Silva", "joao@dasilva.com");

        XmlPath path = RestAssured.get("/usuarios?_format=xml").andReturn().xmlPath();

        List<Usuario> usuarios = path.getList("list.usuario", Usuario.class);

        for (Usuario usuario : usuarios) {
            if (usuario.getNome().equals(joao.getNome())
                && usuario.getEmail().equals(joao.getEmail())) {

                RestAssured.given()
                    .header("Accept", "application/xml")
                    .contentType("application/xml")
                    .queryParam("usuario.id", usuario.getId())
                    .body(usuario)
                .expect()
                    .statusCode(200)
                .when()
                     .delete("/usuarios/deleta");

                System.out.println("deletando id "+usuario.getId());
            }
        }
    }

Os Ids dos objetos saem na console, e o código retornado é 200, mas os objetos permanecem na lista após a execução deste método.

Saída da console, indicando os IDs a remover:

deletando id 8988479731134783866
deletando id 5188998417823748163
deletando id 5094436974643469940
deletando id 8410591817072060597
deletando id 787200955511812578
...

(mas os objetos permanecem na lista!!)

Tem um bug no código, são feitas comparações entre dois objetos Long que sempre retornam false!

 @Test
 public void comparaIds() {
     Long id1 = 9169117855179980407L;
     Long id2 = 9169117855179980407L;

     Assert.assertFalse(id1 == id2);
     Assert.assertTrue(id1.equals(id2));
 }
solução!

Existem dois bugs no código do projeto, na classe UsuarioRepositoryImpl:

(1) no método delete(Usuario entity) trocar

if (current.getId() == entity.getId()) { ... }

por

if (current.getId().equals(entity.getId())) { ... }

(2) no método public Usuario find(Long id) trocar

if (u.getId() == id) return u

por

if (u.getId().equals(id)) return u

Justificativa A comparação entre dois objetos da classe Long normalmente retorna true para o operador "==" apenas quando os objetos correspondem à mesma instância da classe. Para comparar os valores, é preciso utulizar o método equals(Long).

Com esses ajustes, a deleção e a busca pelos novos objetos, criados com números Long randômicos, passará a funcionar.

Observação: A classe LeilaoRepositoryImpl apresenta problemas idênticos no seu código,

Olá José,

Sugiro você abrir um novo tópico com sua dúvida para os demais poder te ajudar e quando tiver a solução visualizar melhor a solução.

Obrigado, Lucas.

Só quis complementar a sequência anterior, caso alguém visite esta dúvida.

Abri um outro item no fórum, com as sugestões de correção no projeto de referência: Como submeter uma correção no código do projeto de referência?

Apesar de antigos, alguns tópicos sugerem respostas a questões que ainda surgem hoje, como por exemplo

[Como recuperar desserializar uma lista de objetos JSON ] (https://cursos.alura.com.br/forum/topico-como-recuperar-desserializar-uma-lista-de-objetos-json-42448)