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

Como verificar se um metodo privado da classe testada foi chamado?

Olá, Estou fazendo os testes de uma service. No método de cadastrar, ele transforma a classe "LocalForm" em "Local".

O metodo salvar() é publico e ja está testado. Porém não estou achando um jeito de testar o metodo "converterParaLocal(form)". Tentei com mockito, mas ai ele retorna exception dizendo que precisa ser uma classe que mockada (O que n pode ser, pois é a mesma classe que estou testando).

Em resumo, o que eu quero testar é somente "converterParaLocal(form)" que é um método privado, entao não posso chamá-lo diretamente através da service. Preciso fazer assertivas se está retornando um Local com os valores de atributos passados pelo LocalForm

public Local cadastrar(LocalForm form) {
        return salvar(converterParaLocal(form));
    }

private Local converterParaLocal(LocalForm form) {
        return Local.builder()
                .nome(form.getNome())
                .endereco(form.getEndereco())
                .build();
    }

@Transactional
public Local salvar(Local local) {
        return localRepository.save(local);
    }

A classe de testes esta assim

class LocalServiceTest extends ServiceTestConfig{

    @InjectMocks
    private LocalService localService;
    @Mock
    private LocalRepository localRepositoryMock;

    //outros testes omitidos

    @Test
    void cadastrar_DeveTransformarLocalFormEmLocal_QuandoRecebeUmLocalFormComTodosDadosObrigatoriosPreenchidos() {
        //Preciso capturar o retorno do metodo privado interno da service que estou testando  -> converterParaLocal(form)
        Local localCadastrado = localService.cadastrar(Util.criarLocalForm()); 

        assertThat(localCadastrado.getNome()).isEqualTo(Util.criarLocalForm().getNome());
        assertThat(localCadastrado.getEndereco()).isEqualTo(Util.criarLocalForm().getEndereco());
    }
2 respostas
solução!

Oi Ronald,

Como o método é privado, não se deveria testá-lo.

Na verdade o teste deve ser feito para o método cadastrar, como você fez, sendo que você pode também verificar se o objeto foi criado corretamente, pois ele é devolvido nesse método publico. Algo como:

@Test
void cadastrar_DeveTransformarLocalFormEmLocal_QuandoRecebeUmLocalFormComTodosDadosObrigatoriosPreenchidos() {
    LocalForm form = new LocalForm("nome", "endereco");

    Local local = service.cadastrar(form);

    //verificando se o repository foi chamado:
    Mockito.verify(localRepositoryMock).save(local);

    //verificando se o objeto Local foi criado corretamente, de acordo com os parametros do objeto Form:
    assertThat(form.getNome()).isEqualTo(local.getNome());
    assertThat(form.getEndereco()).isEqualTo(local.getEndereco());
}

Dessa forma você está testando indiretamente o método privado, pois está validando as informações devolvidas por ele.

Obrigado pelo retorno Rodrigo. Como o método save do repositório já foi testado, eu estava querendo verificar somente se o "private Local converterParaLocal(LocalForm form)" estava fazendo a conversão certa. Revisando sua aula de Mockito me lembrei do @Captor. Como o método do repositorio recebe o Local pronto do "converterParaLocal(LocalForm form)", entao utilizei o captor para resgatar esse valor que seria enviado para o repositorio. Ficou assim no final.

    class LocalServiceTest extends ServiceTestConfig{

    @InjectMocks
    private LocalService localService;
    @Mock
    private LocalRepository localRepositoryMock;
    @Captor
    private ArgumentCaptor<Local> captor;

//outros testes omitidos
    @Test
    void cadastrar_DeveTransformarLocalFormEmLocal_QuandoRecebeUmLocalFormComTodosDadosObrigatoriosPreenchidos() {
        localService.cadastrar(Util.criarLocalForm());
        Mockito.verify(localRepositoryMock).save(captor.capture());
        Local local = captor.getValue();

        assertThat(local.getNome()).isEqualTo(Util.criarLocalForm().getNome());
        assertThat(local.getEndereco()).isEqualTo(Util.criarLocalForm().getEndereco());
    }

}

    }