JUnit’in sağladığı otomatik bağımlılık enjeksiyonu ile test durumlarınızı temizleyin.
Birim testinin amacı, bir uygulamadaki hataları mümkün olan en kısa sürede belirlemektir. Birkaç kanal sizi aynı hedefe götürse de, en verimli rotayı kullanmayı hedeflemelisiniz.
Bir JUnit test takımı, aynı verilere ihtiyaç duyan birkaç test sınıfına sahip olabilir, ancak test verilerini yeniden kullanamazsınız. JUnit’in önceki sürümlerinde, bir yardımcı yöntem oluşturmak ve ardından bir test sınıfının verilerine her ihtiyaç duyduğunda bu yöntemi çağırmak iyi bir yaklaşımdı.
JUnit 5, bu soruna daha verimli bir yaklaşım sağlar: bağımlılık enjeksiyonu (DI).
Bağımlılık Enjeksiyonu Nedir?
DI, bir nesnenin başka bir nesnenin bağımlılıklarını sağladığı bir tasarım modelidir. Bir Java uygulaması oluştururken, işlevini gerçekleştirmek için başka bir sınıfın oluşturduğu bir nesneye bağlı olan bir sınıfınız olabilir.
Bağımlılık enjeksiyonundan önce, farklı bir sınıftan bir nesneyi kullanmak için, o nesnenin ona bağlı olan sınıf içinde yeni bir örneğini oluşturmanız gerekir. Dolayısıyla, aynı nesneye bağlı birkaç sınıfınız varsa, bunun bağımlı sınıflar içinde birkaç örneğini oluşturmanız gerekir.
DI, bir nesneyi o sınıfta yeni bir örneğini oluşturmadan bağımlı bir sınıfta kullanmanıza izin verir.
JUnit 5’te Bağımlılık Enjeksiyonu
JUnit 5, hem test yöntemlerine hem de oluşturuculara bağımlılıklar eklemenize izin verir. Bu, çerçevenin önceki sürümleri, test yöntemlerinin veya oluşturucuların parametrelere sahip olmasına izin vermediğinden önemlidir.
JUnit 5, istediğiniz kadar parametre enjekte etmenize izin verir. Tek yakalama, ParameterResolver API’sinin çalışma zamanında her parametreyi çözebilmesi gerektiğidir. JUnit şu anda otomatik olarak kullandığı üç yerleşik parametre çözümleyiciye sahiptir. Başka bir çözümleyici kullanmak için @ExtendWith açıklamasını kullanarak açıkça kaydetmeniz gerekir.
JUnit’te Bağımlılıkları Enjekte Etme
Bu örnek program, JUnit 5 testine nasıl bağımlılık ekleyebileceğinizi göstermek için JUnit’in yerleşik parametrelerinden birini (TestInfoParameterResolver) kullanır . TestInfoParameterResolver, TestInfo arabirimine ait nesneleri çözümler. Bu nedenle, JUnit 5, onu kullanan herhangi bir yöntem veya yapıcıya TestInfo arabiriminin bir örneğini sağlayacaktır.
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;
class InfoTestInterfaceTest {
// Injecting a testInfo object into the InfoTestInterfaceTest constructor
InfoTestInterfaceTest(TestInfo testInfo) {
assertEquals(“InfoTestInterfaceTest”, testInfo.getDisplayName());
}
// Injecting a testInfo object into methods
@Test
void testMethodName(TestInfo testInfo) {
assertEquals(“testMethodName(TestInfo)”, testInfo.getDisplayName());
}
@Test
@DisplayName(“method using the @DisplayName annotation”)
void testMethodNameTwo(TestInfo testInfo) {
assertEquals(“method using the @DisplayName annotation”, testInfo.getDisplayName());
}
}
Yukarıdaki JUnit testi, bir nesnenin bir yapıcıya nasıl enjekte edileceğini ve iki yöntemi gösterir. JUnit TestInfo arabiriminin nesnesi ile kullanabileceğiniz dört yöntemi vardır.
getDisplayName() yöntemi en kullanışlı olanıdır. Geçerli test yönteminin veya oluşturucunun görünen adını döndürür. Varsayılan olarak, bu ad sınıfı temel alır. Ancak @DisplayName ek açıklamasını kullanırsanız, bunun yerine getDisplayName() yöntemi bu metni döndürür.
Yukarıdaki test sınıfı aşağıdaki test raporunu oluşturur:
JUnit bağımlılık enjeksiyon raporu
Bağımlılıkları destekleyen başka dört tür JUnit açıklamalı yöntem vardır. Bunlar @BeforeAll, @BeforeEach, @AfterAll ve @AfterEach ek açıklamalarıdır. @Test yöntemi gibi, yapmanız gereken tek şey parametre olarak önceki veya sonraki yöntemlerden herhangi birine bir nesne iletmektir ve hazırsınız.