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

Injeção do TestEntityManager para teste de Controller

Olá Rodrigo,

Sei que pra testar o AutenticacaoController com retorno 200 devo antes inserir um usuário, por conta do profile test, mas qual seria a forma de injetar o TestEntityManager nesta classe de teste?

Da forma que foi feita no teste de Repository com o @DataJpaTest acaba dando um conflito, acredito que seja com @SpringBootTest. Dei uma pesquisada e vi exemplos de pessoas usando a própria interface UsuarioRepository para a inserção durante os testes, esta seria a "melhor forma"?

Existe algum modo de injetar o TestEntityManager sem gerar conflito?

De qualquer forma o código a seguir satisfaz o teste.

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
@ActiveProfiles("test")
public class AutenticacaoControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private UsuarioRepository repository;

    @Test
    public void deveDevolver200CasoDadosDeAutenticacaoValidos() throws Exception {
        Usuario usuario = new Usuario();
        usuario.setNome("Aluno");
        usuario.setEmail("aluno@email.com");
        usuario.setSenha("$2a$10$iv.5VotDUkAjyukxPJ33OeuH0Pi5fpg2OJw8v1CHauFnzc/8mhGEO");

        repository.save(usuario);

        URI uri = new URI("/auth");

        JSONObject jsonObj = new JSONObject();
        jsonObj.put("email", "aluno@email.com");
        jsonObj.put("senha", "123456");
        String json = jsonObj.toString();

        mockMvc.perform(MockMvcRequestBuilders
                .post(uri)
                .content(json)
                .contentType(MediaType.APPLICATION_JSON))
        .andExpect(MockMvcResultMatchers
                .status()
                .isOk());
    }
        @Test
    public void deveDevolver400CasoDadosDeAutenticacaoInvalidos() throws Exception  {
        // implementacao da aula
    }
}
2 respostas

Oi Cezar,

Voce pode tentar anotar a classe de teste com @AutoConfigureTestEntityManager, para ver se rola de injetar o TestEntityManager.

Se nao der certo, o jeito sera utilizar o repository mesmo, sendo que nao tem problemas quanto a isso :)

Bons estudos!

solução!

Rodrigo,

Obrigado pela sugestão, testei aqui com a anotação @AutoConfigureTestEntityManager mas sem sucesso inicialmente, o erro foi No transactional EntityManager found.

Após isso dei uma pesquisada e vi que o @DataJpaTest é por padrão transacional.

"By default, data JPA tests are transactional and roll back at the end of each test."

Esse trecho da documentação do Spring, fala brevemente sobre o uso do TestEntityManager sem o @DataJpaTest utilizando @AutoConfigureTestEntityManager.

E por fim a solução foi utilizar além da anotação @AutoConfigureTestEntityManager, a @Transactional.

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

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private TestEntityManager em;

    @Test
    public void deveDevolver200CasoDadosDeAutenticacaoValidos() throws Exception {

        Usuario usuario = new Usuario();
        usuario.setNome("Aluno");
        usuario.setEmail("aluno@email.com");
        usuario.setSenha("$2a$10$iv.5VotDUkAjyukxPJ33OeuH0Pi5fpg2OJw8v1CHauFnzc/8mhGEO");

        em.persist(usuario);

        URI uri = new URI("/auth");

        JSONObject jsonObj = new JSONObject();
        jsonObj.put("email", "aluno@email.com");
        jsonObj.put("senha", "123456");
        String json = jsonObj.toString();

        mockMvc.perform(MockMvcRequestBuilders
                .post(uri)
                .content(json)
                .contentType(MediaType.APPLICATION_JSON))
        .andExpect(MockMvcResultMatchers
                .status()
                .isOk());
    }