10
respostas

como testar quando retorno é nulo

Boa noite, como faço para usar o mockito,when quando o retorno vem uma lista vazia? num metodo que não recebe parametro?

que testar se o metodo devolve uma lista vazia quando a informação não existe na base.

Obrigada.

10 respostas

Oi Guilherme,

Se você precisar "mockar" o retorno para vir uma lsita vazia:

Mockito.when(mock.metodo()).thenReturn(Collections.emptyList());

E para verficar a lista:

assertTrue(lista.isEmpty());

Boa tarde professor, tudo bem??

Ao tentar implementar ele dá erro na parte do collections

 Mockito.when(Mockito.mock(usuarioRepository.retornaUsuario()
                        .getClass()))
                .thenReturn(Collections.emptyList());

erro: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

outra duvida essa implentação se retonar valor, vai passar no teste?

Oi Guilherme,

Vou precisar ver o teu codigo completo para entender melhor o que você deseja simular de comportamento para o teste.

é um metodo bem simples, estou usando para estudos e gostaria de saber se consigo testar esse metodo num cenario de retorno nulo. Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Seria algo assim?

classe que você deseja testar:

public class ProdutoService {

    private ProdutoRepository repository;

    public Produto buscar(Long id) {
            return repository.buscarPorId(id);
    }

}

Classe de teste:

@ExtendWith(MockitoExtension.class)
public class ProdutoServiceTest {

    @InjectMocks
    private ProdutoService service;

    @Mock
    private ProdutoRepository repository;

    @Test
    void deveriaRetornarUmProdutoComIdCadastrado() {
            Mockito.when(repository.findById(1l)).thenReturn(new Produto());

            Produto encontrado = service.buscar(1l);

            assertNotNull(encontrado);
    }

    @Test
    void deveriaRetornarNullComIdInexistente() {
            Mockito.when(repository.findById(999l)).thenReturn(null);

            Produto encontrado = service.buscar(999l);

            assertNull(encontrado);
    }

}

Ola, boma dia!

Eu queria testar um metodo de um batch, esse batch ele fica indo na base verificar se existe algo para ele selecionar e jogar numa fila Kafka, esse metodo não recebe parametro, ele faz a busca só pegando o que tem na base. Caso ele não ache nada ele retorna uma lista de usuario vazia.

Como teste se o metodo retorna mesmo uma lista vazia quando não encontra valor?

Acho que seria algo assim então:

Classe com a lógica:

public class BatchService {

    private UsuarioRepository repository;
    private FilaKafka filaKafka;

    public List<Usuario> executar() {
        //lista vem vazia quando nao tem registro:
        List<Usuario> usuarios = repository.buscar();

        // se tem registros, envia para o kafka
        if (!usuarios.isEmpty()) {
            filaKafka.enviar(usuarios);
        }

        return usuarios;
    }
}

Classe de testes:

@ExtendWith(MockitoExtension.class)
public class BatchServiceTest {

    @InjectMocks
    private BatchService service;

    @Mock
    private UsuarioRepository repository;

    @Mock
    private FilaKafka filaKafka;

    @Test
    void deveriaEnviarParaFilaQuandoExistemRegistros() {
            List<Usuario> usuarios = Arrays.asList(new Usuario());
            Mockito.when(repository.buscar()).thenReturn(usuarios);

            List<Usuario> devolvidos = service.executar();

            // lista nao pode ser vazia
            assertFalse(devolvidos.isEmpty());

            // verificando se a lista foi enviada para o kafka:
            Mockito.verify(filaKafka.enviar(usuarios));
    }

    @Test
    void deveriaDevolverListaVaziaQuandoNaoExistemRegistros() {
            List<Usuario> usuarios = new ArrayList<>();
            Mockito.when(repository.buscar()).thenReturn(usuarios);

            List<Usuario> devolvidos = service.executar();

            // lista deve ser vazia
            assertTrue(devolvidos.isEmpty());

            // verificando se o kafka nao foi chamado:
            Mockito.verifyNoInteractions(filaKafka);
    }

}

Ola, é basicamente isso mesmo, cheguei a testar no cenário em que o batch retorna nullo e deu sucesso porém o outro teste que espera valor acaba falhando.

Tem como colocar uma condição aqui: Mockito.when(repository.buscar()).thenReturn(usuarios); para que ele só verifique se o retono é nulo ou se tem valor, de acordo com o teste que está sendo escrito?

Como existem dois possiveis retornos só um dos teste dá sucesso, um deles acaba falhando dependendo do que retorna do repository.

Obrigada.

Oie. algum retorno sobre o ponto acima??/

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software