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

Testes direto no serviço

pra realizar testes dentro de um @Service, pegando toda a logica junto da camada de persistência, eu teria que considerar o teste em controllers mesmo ou teria uma outra forma mais adequada pra isso?

6 respostas

Oi Mateus

Você poderia fazer um mock da camada de service e testar apenas a lógica do Controller

mas pra testar a logica do service so pelo controller mesmo?

Oi Mateus,

Se você quer testar as regras de negócio que estão em uma classe service, o ideal é criar um classe de testes especifica para essa classe service.

Inclusive, você pode utilizar mocks para simular comportamentos das dependências que essa service tiver.

Bons estudos!

Entendido Rodrigo, mas em relação as anotações de uso do spring, teria algo em especifico? ate então eu só conheço teste nos serviços usando JUnit puro

solução!

Oi Mateus,

No caso de classes service não deveria ter interferência do Spring na hora de escrever os testes.

Exemplo:

@Service
public class ClienteService {

    private ClienteRepository repository;

    public ClienteService(ClienteRepository repository) {
        this.repository = repository;
    }

    public void cadastrar(Cliente novo) {
        boolean jaCadastrado = repository.existsByCpf(novo.getCpf());
        if(jaCadastrado) {
            throw new RegraDeNegocioException("Cliente com o mesmo CPF já está cadastrado!");
        }
        // outras regras de negocio...

        repository.save(novo);
    }
}
@ExtendWith(MockitoExtension.class) // no caso de Junit 4 trocar para: @RunWith(MockitoJUnitRunner.class)
public class ClienteServiceTest {

    @InjectMocks
    private ClienteService service;

    @Mock
    private ClienteRepository repository;

    @Test
    public void naoDeveriaCadastarClienteComCPFJaCadastrado() {
        Cliente cliente = new Cliente("Fulano da Silva", "123.456.789-00");

        //simulando que fez um select no banco de dados com o mock do repository
        Mockito.when(repository.existsByCpf(cliente.getCpf())).thenReturn(true);

        RegraDeNegocioException exception = assertThrows(RegraDeNegocioException.class, () -> service.cadastrar(cliente));
        assertTrue(exception.getMessage().contains("Cliente com o mesmo CPF já está cadastrado!"));
    }

    //outros cenarios de testes....
}

Bons estudos!

A legal, ficou claro, obg pela ajuda