7
respostas

Exemplo de teste Unitário da classe OrdemService

Ao testar uma classe de OrdemService, gostaria de um exemplo para mockar os metodos de internos chamados. tipo de dentro do OrdemService.listar() é chamado o ordemRepository.listarAll(), logo gostaria de garantir que este ultimo metodo esta sendo chamado.

algo parecido que se faz em java ao mockar as interfaces internas e treinar o nosso mock chamando os metodos expect(mock.metodo()).andReturn(listaRetornada); depois se fazia no java o veriry(ClasseMockada)

tem algum exemplo deste cenário?

ats

7 respostas

Ramon, boa tarde. Se eu entendi, o que você quer é, verificar se o método do repository é realmente invocado quando você chama o método do service, correto? O que você pode fazer é algo nesse sentido.

Mockar o seu service e criar um @BeforeEach com o conteúdo abaixo.

when(ordemRepository.listAll(...).thenReturn(Object);

Então no seu teste, quando você chamasse o service.listar(...), ele vai chamar o repository, que você já tratou no @Before ...

Feito isto, você pode verificar com o verify se ordemRepository.listAll(...) foi chamado.

Geralmente eu faço isso.

Você pode até forçar uma exceção no listAll(...) do repository e testar se quando você chamar o seu service, se dará um erro.

Enfim, espero que tenha fica claro a minha ideia acima e caso não, responda aqui que vemos outras opções.

Mockar o seu service e criar um @BeforeEach com o conteúdo abaixo. Duvida: esse metodo anotado com @beforeEach, com o conteudo when(ordemRepository.listAll(...).thenReturn(Object); será chamado pra cada metodo de teste no meu testcase, porem dentro de um test case eu testo varioz métodos com comportamentos diferentes, chamando diferentes metodos alem do listAll()..., no meu caso preciso mazer um mock pra cada cenario, chamando metodos diferentes de um teste pra outro, logo essa sua sugestão nao me atenderia

agradeço desde ja se tiver outra forma que me atenda.

Então não precisa fazer no @BeforeEach, você pode fazer dentro do próprio teste, que irá chamar o service que por sua vez vai chamar o repository. A questão é, você simula uma possível chamada do método do repository e verifica se no teste do service, ele bateu no repository. Fez sentido?

humm, joão deixa explicarcom outra classe a ser testada o o conportamento do seu metodo, ex com o OrdemService.inserir(), quero testar o cenário em que o codigo interno do metodo OrdemService.inserir() ira chamar o ordemRepository.persist(ordem),

então eu teria que mockar o OrdemRepository e treinar o mock when(ordemRepository.inserir(...))? e depois chamar o verify passando o mock do ordemRepository.

É isso? teria como você fazer um exemplo deste tipo de teste? pois oque quero testar é o comportamento interno do OrdemService.inserir().

Seria isso ... Você mockaria o repository. Então quando você chamasse o seu método do service (seja ele qual for) vc ia conseguir verificar se houve chamada para o método do repository.

Uma ideia.

@Mock
private OrdemRepository ordemRepository;

@Mock
private OrdemService ordemService;

@Test
private void testListAll( ) {
    when(ordemRepository.listAll( )).thenReturn(Object);

    ordemService.listar( );

    //verifica se repository.listAll( ) foi chamado
}


Era isso mesmo que estava imaginando.

só uma observação, existe a necessidade de mockar tambem ordemService?

desde ja agradecido pelo retorno.

Opa, que bom que chegamos a uma possível solução. Referente ao ordemService, você pode injetá-lo diretamente, mas geralmente eu tenho preferência por mockar. =)

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