Durante o teste de unidade, não é esperado que você teste com um banco de dados, ou pelo menos não com um banco de dados que não tenha preparado para o teste de unidade. Testar com um banco de dados e, como tal, testar diferentes camadas do seu aplicativo ao mesmo tempo é geralmente visto como testes de integração . Com os testes de unidade, você deve testar apenas o que o seu método faz, o que ele retorna dependendo dos parâmetros diferentes e quando (ou não) deve falhar.
É esperado que, em seu método, você faça chamadas para métodos X de outras classes. Você não está testando esses métodos X , portanto, o que você precisa fazer é zombar desses métodos.
Suponho que você esteja escrevendo seu código em Java; nesse caso, você possui ótimas estruturas de zombaria, como o Mockito, que podem ser úteis para você. Se você usa ou não uma estrutura de simulação é sua escolha, vou apenas dizer que eles economizarão muito tempo e a que mencionei pelo menos não é realmente complicada.
Se você deseja apenas escrever seu próprio mock para experimentar, suponha que você tenha a seguinte CustomerRepository
classe:
public class CustomerRepository {
public CustomerDTO getCustomer(int id) {
...
}
}
Você pode escrever sua própria CustomerRepository
classe zombada e suja da seguinte maneira:
public class MockedCustomerRepository extends CustomerRepository {
public boolean bThrowDatabaseException;
public boolean bReturnNull;
public boolean bReturnCustomerWrongId;
public boolean bReturnCustomerWithId;
public CustomerDTO getCustomer(int id) {
if(bThrowDatabaseException) {
throw new DatabaseException("xxx");
} else if(bReturnNull) {
return null;
} else if(bReturnCustomerWrongId) {
throw new CustomerNotExistException(id);
} else if(bReturnCustomerWithId) {
return new CustomerDTO(id);
}
}
}
Então, no seu caso de teste, você basicamente substitui sua instância "padrão" CustomerRepository
por uma instância simulada que permitirá testar seu método para vários resultados de getCustomer
:
public class CustomerRestTest {
public void testGetCustomer_databaseFailure() {
MockedCustomerRepository dto = new MockedCustomerRepository();
dto.bThrowDataBaseException = true;
yRestClass rest = new MyRestClass();
rest.dto = dto;
rest.getCustomer(0);
// depending on what you do in your getCustomer method, you should check if you catched the exception, or let it pass, etc.. Make your assertions here
public void testGetCustomer_customerNotExist() {
// etc.
}
}
Geralmente, todo método de teste deve testar apenas uma coisa, isso ajuda a manter seus testes pequenos e focados em uma tarefa.
Vou repetir :-) Escrever uma aula toda ridicularizada leva algum tempo, como você vê. Considere usar uma estrutura de zombaria, quanto menos se escreve código, menos erros se comete , certo? Zombar de um método que gera uma exceção ou retorna um determinado valor para um determinado parâmetro é um pedaço de bolo e leva 2 ou 3 linhas (com pelo menos mockito)
Espero que ajude a testar seu método REST.