Во время модульного тестирования от вас не ожидается тестирования с базой данных или, по крайней мере, с базой данных, которую вы не подготовили для модульного тестирования. Тестирование с использованием базы данных и, следовательно, одновременное тестирование различных уровней вашего приложения обычно рассматривается как интеграционные тесты . С помощью модульных тестов вы должны тестировать только то, что делает ваш метод, что он возвращает в зависимости от различных параметров, и когда (или нет) он должен потерпеть неудачу.
Очень ожидаемо, что в вашем методе вы делаете вызовы методов X из других классов. Вы не испытывать эти X методов так , что вы должны сделать , это высмеивать эти методы.
Я предполагаю, что вы пишете свой код на Java, в этом случае у вас есть отличные фреймворки, такие как Mockito, которые могут быть вам полезны. Независимо от того, используете ли вы фреймворк или нет, я просто скажу, что они сэкономят вам много времени, и тот, который я упомянул, по крайней мере, не сложен.
Если вы просто хотите написать свой собственный макет для эксперимента, то предположим, что у вас есть следующий CustomerRepository
класс:
public class CustomerRepository {
public CustomerDTO getCustomer(int id) {
...
}
}
Вы можете написать свой собственный издевательский и грязный CustomerRepository
класс следующим образом:
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);
}
}
}
Затем в вашем тестовом примере вы в основном заменяете свой «стандартный» экземпляр CustomerRepository
на макетированный экземпляр, который позволит вам протестировать ваш метод для различных результатов 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.
}
}
Как правило, каждый метод тестирования должен проверять только одну вещь, это помогает сделать ваши тесты небольшими и сфокусированными на одной задаче.
Я собираюсь повторить это :-) Как вы видите, написание целого издевательского класса занимает некоторое время. Подумайте об использовании фальшивого фреймворка: чем меньше вы пишете код, тем меньше ошибок делаете , верно? Насмешка над методом, который выдает исключение или возвращает заданное значение для заданного параметра, - это кусок пирога и занимает 2 или 3 строки (по крайней мере, с mockito)
Надеюсь, это поможет проверить ваш метод REST.