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

Problemas ao testar Endpoint de detalhes

Boa tarde Rodrigo,

Estou tentando implementar um teste para validar o endpoint de detalhar um tópico. Porém estou tomando erro dizendo que esta retornando 404 ao invés de 200, gostaria de uma ajuda para ver se estou fazendo alguma coisa errada.

Desde já agradeço pela atenção.

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
@AutoConfigureTestEntityManager
@Transactional
@ActiveProfiles("test")
public class TopicosControllerTest {

    private MockHttpServletRequestBuilder request;
    private ResultMatcher expectedResult;

    @Autowired
    private TestEntityManager entityManager;

    @Autowired
    private MockMvc mock;

    @Before
    public void setUp() throws Exception {
        Curso springBoot = new Curso();
        Curso html5 = new Curso();

        springBoot.setNome("Spring Boot");
        springBoot.setCategoria("Programação");

        html5.setNome("HTML 5");
        html5.setCategoria("Front-end");

        Topico topico1 = new Topico("Dúvida", "Error ao criar projeto", springBoot);
        Topico topico2 = new Topico("Dúvida 2", "Projeto não compila", springBoot);
        Topico topico3 = new Topico("Dúvida 3", "Tag HTML", html5);

        entityManager.persist(springBoot);
        entityManager.persist(html5);

        entityManager.persist(topico1);
        entityManager.persist(topico2);
        entityManager.persist(topico3);
    }

    @Test
    public void testDetalhar() throws Exception {
        request = MockMvcRequestBuilders.get("/topicos/1");
        expectedResult = MockMvcResultMatchers.status().isOk();

        String response = mock.perform(request).andExpect(expectedResult).andReturn().getResponse()
                .getContentAsString();

        Assert.assertNotNull(response);
        Assert.assertTrue(response.contains("NAO_RESPONDIDO"));
    }

}
6 respostas

Oi Marcos,

Consegue compartilhar o seu projeto?

Claro,

Segue o link do repositório: Alura Backend

A classe de testes é a TopicosControllerTest e o método que estou tendo problemas é o testDetalhar

Desde já agradeço pela ajuda.

Bom dia Rodrigo,

Continuei a saga de tentar entender o que estava acontecendo, e vi que ao testar o método de detalhar a seguinte exceção esta sendo levantada:

Exceção

No momento em que a linha:

String response = mock.perform(request).andExpect(expectedResult).andReturn().getResponse()
                .getContentAsString();

É executada no meu teste. Daí me vieram as seguintes perguntas na mente:

  • Uma vez que tenho um método de setUp anotado com @Before e ele esta chamando o entityManager.persist() passando um topico, ele não deveria estar "salvando" isso no banco? Para que dessa forma ao tentar recupera-lo ele consiga obter sucesso?
  • Caso haja algum problema com esse fluxo de salvar os dados no banco para os testes, o método de listar não deveria falhar também?
  • Para a execução dos testes seria necessário adicionar no Run Configuration a linha -Dspring.profiles.active=test ??? Uma vez que o único parâmetro que é passado a JVM é um -ea ? Ou a anotação @ActiveProfiles("test") já teria a incumbência de resolver isso?

Desde já agradeço pela ajuda e atenção.

Oi Marcos,

A anotacao @ActiveProfiles ja substitui o parametro da JVM.

A principio ele nao esta salvando no banco de dados os registros, por algum motivo.

Tenta utilizar na sua classe de teste as interfaces repository para salvar os registros, ao inves de utilizar o TestEntityManager e veja se funciona.

Acabei de realizar o teste, e infelizmente também não resolveu ='(

O erro persiste o mesmo:

java.lang.AssertionError: Status expected:<200> but was:<404>
    at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:59)
    at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:122)
    at org.springframework.test.web.servlet.result.StatusResultMatchers.lambda$matcher$9(StatusResultMatchers.java:627)
    at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:196)
    at br.com.alura.forum.controllers.TopicosControllerTest.testDetalhar(TopicosControllerTest.java:105)
solução!

Rodrigo,

Pedi ajuda para a galera no Discord do challenge da Alura e consegui resolver o problema, a solução foi adicionar a anotação:

@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)

No cabeçalho das minhas classes, isso faz com que o bd reinicie as colunas auto incrementais e os testes passaram a passar.

\o/