Незважаючи на тестування одиниць, ви не будете тестуватись із базою даних або, принаймні, не з базою даних, яку ви не підготували для тестування одиниць. Тестування з базою даних і, як таке, тестування різних шарів вашої програми одночасно, як правило, сприймається як тести інтеграції . За допомогою одиничних тестів ви повинні перевірити лише те, що робить ваш метод, що він повертає залежно від різних параметрів, а коли (чи ні) він повинен вийти з ладу.
Дуже очікується, що у своєму методі ви здійснюєте дзвінки до методів 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 рядки (з макеті принаймні)
Сподіваємось, що допоможе протестувати ваш метод REST.