Saat pengujian unit Anda tidak diharapkan untuk menguji dengan database, atau setidaknya, tidak dengan database yang belum Anda siapkan untuk pengujian unit. Menguji dengan database, dan dengan demikian, menguji berbagai lapisan aplikasi Anda pada saat yang sama umumnya dilihat sebagai tes integrasi . Dengan unit test Anda seharusnya hanya menguji apa metode Anda, apa yang dikembalikan tergantung pada parameter yang berbeda, dan kapan (atau tidak) itu harus gagal.
Sangat diharapkan bahwa dalam metode Anda, Anda membuat panggilan ke metode X dari kelas lain. Anda tidak menguji metode X ini sehingga yang harus Anda lakukan adalah mengejek metode ini.
Saya kira Anda sedang menulis kode di Jawa, dalam hal ini Anda memiliki kerangka kerja mengejek yang hebat seperti Mockito yang mungkin membantu Anda. Apakah Anda menggunakan kerangka mengejek atau tidak adalah pilihan Anda, saya hanya akan mengatakan mereka akan menghemat banyak waktu dan yang saya sebutkan setidaknya benar-benar tidak rumit.
Jika Anda hanya ingin menulis tiruan sendiri untuk bereksperimen, anggaplah Anda memiliki CustomerRepository
kelas berikut :
public class CustomerRepository {
public CustomerDTO getCustomer(int id) {
...
}
}
Anda dapat menulis sendiri mengejek dan kotor Anda CustomerRepository
kelas dengan cara berikut:
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);
}
}
}
Kemudian, dalam kasus pengujian Anda, pada dasarnya Anda mengganti instance "standar" Anda CustomerRepository
dengan instance tiruan yang akan memungkinkan Anda menguji metode Anda untuk berbagai hasil dari 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.
}
}
Secara umum, setiap metode pengujian harus menguji satu hal saja, ini membantu menjaga tes Anda kecil dan fokus pada satu tugas.
Saya akan mengulanginya :-) Menulis seluruh kelas yang diejek membutuhkan waktu seperti yang Anda lihat. Pertimbangkan untuk menggunakan kerangka mengejek, semakin sedikit yang menulis kode, semakin sedikit kesalahan yang dibuat , bukan? Mengejek metode yang melempar pengecualian, atau mengembalikan nilai yang diberikan untuk parameter tertentu adalah sepotong kue dan membutuhkan 2 atau 3 baris (dengan setidaknya mockito)
Semoga itu membantu menguji metode REST Anda.