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

Mockando objetos internos

Tenho uma dúvida, estou usando o springboot e tentando usar o Mockito, o cenário é o seguinte, tenho um @service que executa um get em outro serviço para buscar uma lista metodo= getListFalhas() e tenho outro método que trabalha em cima desta lista metodo= executeWhatever(), ai estou com duvida para testar este metodo, pois estou tentando mockar o getListFalhas() para quando ele for chamado dentro de executeWhatever() não precise fazer o get e sim use a minha lista que foi passada, a minha duvida é como mockar 1 comportamento sendo que eu teria que mockar a classe? ouu se é possivel eu mockar o meu objeto utilitario que esta dentro da classe getListFalhas() sem ter que passar ele por parametro? esperto que de para entender o cenario, grato pela força!!!

6 respostas

Oi David,

Pelo que entendi você quer que quando chame o getListFalhas() ele te devolva uma outra lista que você construiu, correto? Se for é só você mockar a classe que executa esse método e usar o whene thenReturn do Mockito para retornar sua lista. Ajudou?

Abraço

Só que na aula, o professor passa o objeto "mockado", para a classe para ser trabalhado... a minha duvida é... E se na classe não poder ter um "Setter" do objeto "mockado", teria como fazer isso? tipo vou dizer por fora o que o mockado deve retornar mas nao vou passar ele para a classe de serviço e internamente ele vai saber o que retornar! não sei se estou sendo claro é que o problema é meio complexo mesmo. Mas valeu pela atenção!

Consegue escrever um código bem simples aqui pra mostrar o que vc quer fazer? Fica mais fácil pra fácil ajudar

Sim claro segue um exemplo... e grato pela ajuda...

class FazAlgumaTarefa {

    public String fazerAlgumaCoisa(){
        return "Fiz alguma coisa";
    }

}


class ServicoFazAlgumaCoisa {

    private FazAlgumaTarefa fazerAlgumaTarefa;

    public String FazendoAlgumServico(){
        return fazerAlgumaCoisa.fazerAlgumaCoisa();
    }

}

class TesteServicoFazAlgumaCoisa {

    @Before
    public void setup(){
            //Aqui esta a duvida é possivel eu mockar este objeto sem ter que passar ele no construtor como esta no curso??
            //Como neste exemplo não passei ele para a classe de serviço massss mesmo assim ela usar este mock....
            FazAlgumaTarefa fazAlgumaTarefa = mock(FazAlgumaTarefa.class)
            when(fazAlgumaTarefa.fazerAlgumaCoisa()).thenReturn("outro texto");
    }

    @Test
    public void test testeServicoFazAlgumaCoisa(){

        ServicoFazAlgumaCoisa servicoFazAlgumaCoisa();

        //Aqui o resultado vai ser o "Fiz alguma coisa"... pois não passei o mock
        assertEquals("outro texto", servicoFazAlgumaCoisa.FazendoAlgumServico());

    }

}
solução!

Oi David,

Entendi o seu problema. Nesse caso você tem que informar para o Mockito que quer injetar Mocks através da anotação @InjectMocks sobre a classe que terá os mocks injetados.

Ex:

@RunWith(MockitoJUnitRunner.class)
public class MeuTest
    @InjectMocks
    private ServicoFazAlgumaCoisa servico = new ServicoFazAlgumaCoisa();

    @Mock
    private FazAlgumaTarefa fazAlgumaTarefa;

    @Test
    public void someTest() {
    when(fazAlgumaTarefa.fazerAlgumaCoisa()).thenReturn("outro texto");
    servico. fazendoAlgumServico();
    }
}

Cara muito obrigado ajudou muito, e só para complementar, estou usando o Springboot ainda foi possível usar o @Autowired junto com o @InjectMock, valew mesmo.