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

Como fazer teste de isEmpty em um if?

Bom dia, eu estou tentando fazer um teste de um if que contem uma verificação, se a lista é vazia, se for lança um exeption, se não for, continua com os próximos passos, esta da seguinte forma:

metodo() {

ClasseRequest request = new ClasseRequest(); String email = request.getEmail(); List list = listDto;

if (nonNull(email)) {
    // aqui ele faz uma implementação adicionando o email a lista listDto.
} else {
        // aqui ele diz que o email é nulo
}

if (listDto.isEmpty()) {
        // aqui ele lança um exeption, dizendo que a lista esta vazia
}

} . . . .

o programa esta rodando numa boa, porém o motivo principal é que eu não estou conseguindo fazer o teste unitario dessa camada:
if (listDto.isEmpty()) {
        // aqui ele lança um exeption, dizendo que a lista esta vazia
}

Queria a ajuda de vcs, como fazer um teste unitario desse, estou usando o código java 1.8 pelo intellij, tem como me ajudar ou dar exemplos?
9 respostas

Oi Diogo,

O problema para testar esse método é que dentro dele você está instanciando diretamente o objeto ClasseRequest e a lista, e com isso vai ficar dificil de simular um compartamento via mocks, para poder realizar um teste de unidade. O ideal seria que eles fossem atributos da classe, pois com isso ficaria bem mais simples de testar.

Então os demais campos eu consegui fazer teste unitario usando o when().ThenThrow, instanciando as classes e e colocando os dados no when. O meu problema é, como eu testo esse tal do isEmpty() ?

tipo, eu teria que testar se a lista ListDto é vazia ou não, assim se for, me retorna uma execption, certo?

mas eu não sei bem como ou qual código usar para testar isEmpty(), não conheço bem, o resto do metodo ta testado de boa, só esse if ai que me pega.

Você comentou que seria melhor que eles fossem atributos da classe, mas como assim? não entendi bem essa parte.

Se você precisa fazer um teste para verificar se a exception é lançada, basta simular uma situação em que a lista está vazia e então verificar se ao chamar o método uma exception será lançada:

//configuracoes dos mocks para simular a lista vazia...


assertThrows(Exception.class, () -> classe.metodo());

Ah bacana, ja é um caminho, o que seriam essas configurações dos mocks para simular a lista vazia?

Seria tipo uma instancia da Lista, tipo: List listDto; ?

solução!

Vou mostrar um exemplo em código para ficar mais fácil de entender.

Imagine que você tem uma classe que representa um carrinho de compras, em uma aplicação de um ecommerce:

public class CarrinhoDeCompras {

    private List<Item> itens = new ArrayList<>();

    public void finalizarCompra() {
        if(itens.isEmpty()) {
            throw new ValidacaoException("compra não pode ser finalizada com carrinho vazio!");
        }

        //outras validacoes, salva no banco, envia email, gera nf, etc...
    }

}

Para testar essa classe podemos criar uma classe de testes com JUnit e Mockito assim:

@RunWith(MockitoJUnitRunner.class)
public class CarrinhoDeComprasTest {

    @InjectMocks
    private CarrinhoDeCompras carrinho;

    @Mock
    private List<Item> itens;

    @Test
    public void naoDeveriaFinalizarCompraComCarrinhoVazio() {
        //simulando que o carrinho de compras esta vazio:
        Mockito.when(itens.isEmpty()).thenReturn(true);

        //verificando se uma exception é lançada quando tenta finalizar compra com carrinho vazio
        assertThrows(ValidacaoException.class, () -> carrinho.finalizarCompra());
    }


    @Test
    public void deveriaFinalizarCompraComCarrinhoContendoItens() {
        //simulando que o carrinho de compras tem itens:
        Mockito.when(itens.isEmpty()).thenReturn(false);

        //asserts para verificar se as logicas no metodo finalizarCompra foram executadas normalmente
    }

}

Repara que utilizei o Mockito para simular a lista vazia e não vazia nos dois cenários de teste.

Era isso mesmo que eu precisava, estava na duvida de como usar bem o isEmpty() em um teste unitario, valeu mesmo Rodrigo, vc é fera!

Show!

Mas o ideal mesmo seria não fazer um mock do isEmpty, e sim utilizar os próprios métodos da classe para manipular a lista. Por exemplo, na classe CarrinhoDeCompras, poderia ter um método para adicionar um item na lista:

public void adicionar(Item item) {
    this.itens.add(item);
}

E com isso o teste ficaria assim:

 @Test
public void deveriaFinalizarCompraComCarrinhoContendoItens() {
    //simulando que o carrinho de compras tem itens:
    carrinho.adicionar(new Item(/*parametros do item...*/));
    carrinho.adicionar(new Item(/*parametros do item...*/));

    //asserts para verificar se as logicas no metodo finalizarCompra foram executadas normalmente
}

Bons estudos!

Beleza, valeu pelo ajuda ai, vou fazer isso, tmj :D