Birim sınaması sırasında, bir veritabanı ile sınamanız beklenmez veya en azından, birim sınaması için hazırlanmadığınız bir veritabanı ile sınamanız beklenmez. Bir veritabanı ile test etmek ve bu nedenle uygulamanızın farklı katmanlarını aynı anda test etmek genellikle entegrasyon testleri olarak görülür . Birim testleri ile yalnızca yönteminizin ne yaptığını, farklı parametrelere bağlı olarak ne döndürdüğünü ve ne zaman (ya da değil) başarısız olması gerektiğini test etmeniz gerekir.
Metodunuzda diğer sınıflardan X metoduna çağrı yapmanız çok beklenir . Bu X yöntemlerini test etmiyorsunuz, bu yüzden yapmanız gereken bu yöntemleri alay etmek.
Kodunuzu Java ile yazdığınızı varsayalım, bu durumda Mockito gibi size yardımcı olabilecek harika alaycı çerçeveleriniz var. Alaycı bir çerçeve kullansanız da kullanmasanız da tercihiniz olsun, sadece size çok zaman kazandıracaklarını ve en azından bahsettiğim çerçevenin gerçekten karmaşık olmadığını söyleyeceğim.
Denemek için sadece kendi alayınızı yazmak istiyorsanız, aşağıdaki CustomerRepository
sınıfa sahip olduğunuzu varsayalım :
public class CustomerRepository {
public CustomerDTO getCustomer(int id) {
...
}
}
Kendi alaycı ve kirli CustomerRepository
sınıfınızı şu şekilde yazabilirsiniz :
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);
}
}
}
Ardından, test durumunuzda temel olarak "standart" örneğinizi, CustomerRepository
yönteminizi çeşitli sonuçlar için test etmenizi sağlayacak alay edilmiş bir örnekle değiştirirsiniz 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.
}
}
Genel olarak, her test yöntemi sadece bir şeyi test etmelidir, bu testlerinizi küçük tutmanıza ve bir göreve odaklanmanıza yardımcı olur.
Tekrar edeceğim :-) Bütün alaycı bir sınıf yazmak gördüğünüz gibi biraz zaman alıyor. Alaycı bir çerçeve kullanmayı düşünün, ne kadar az kod yazarsa, o kadar az hata yapar , değil mi? İstisna atan veya belirli bir parametre için belirli bir değer döndüren bir yöntemi alay etmek çok kolay ve 2 veya 3 satır (en az mockito ile) alır
Umarız REST yönteminizi test etmenize yardımcı olur.