Özel alanları yansıma yoluyla alma / ayarlama
Burada birkaç cevapta yapılan yansımayı kullanmak, kaçınabileceğimiz bir şeydir.
Birden fazla dezavantaj sunarken buraya küçük bir değer getirir:
- yansıma sorunlarını yalnızca çalışma zamanında tespit ederiz (ör: artık mevcut olmayan alanlar)
- Kapsülleme istiyoruz, ancak görünür olması ve sınıfı daha opak ve daha az test edilebilir hale getirmesi gereken bağımlılıkları gizleyen opak bir sınıf değil.
- kötü tasarımı teşvik eder. Bugün bir
@Value String field
. Yarın bu sınıfta ilan edebilir 5
ya 10
da onlardan ders verebilir ve sınıfın tasarımını azalttığınızın farkında bile olmayabilirsiniz. Bu alanları (oluşturucu gibi) ayarlamak için daha görünür bir yaklaşımla, tüm bu alanları eklemeden önce iki kez düşünecek ve muhtemelen onları başka bir sınıfa ve kullanıma sokacaksınız @ConfigurationProperties
.
Sınıfınızı hem üniter hem de entegrasyonda test edilebilir yapın
Spring bileşen sınıfınız için hem düz ünite testlerini (çalışan bir yay kabı olmayan) hem de entegrasyon testlerini yazabilmek için, bu sınıfı Spring ile veya Spring olmadan kullanılabilir hale getirmeniz gerekir.
Gerekli olmadığında bir birim testinde kapsayıcı çalıştırmak, yerel yapıları yavaşlatan kötü bir uygulamadır: bunu istemezsiniz.
Bu cevabı ekledim çünkü burada hiçbir cevap bu ayrımı göstermiyor gibi görünüyor ve bu nedenle sistematik olarak çalışan bir konteynere güveniyorlar.
Bu yüzden sınıfın bir iç olarak tanımlanan bu özelliği taşımak gerektiğini düşünüyorum:
@Component
public class Foo{
@Value("${property.value}") private String property;
//...
}
Spring tarafından enjekte edilecek bir yapıcı parametresine:
@Component
public class Foo{
private String property;
public Foo(@Value("${property.value}") String property){
this.property = property;
}
//...
}
Birim test örneği
Yaysız başlatabilir ve kurucu sayesinde Foo
herhangi bir değer enjekte edebilirsiniz property
:
public class FooTest{
Foo foo = new Foo("dummyValue");
@Test
public void doThat(){
...
}
}
Entegrasyon testi örneği
Sen bu basit bir yolu sayesinde Bahar Boot ile bağlamda mülkiyet enjekte edebilir properties
oznıtelığı @SpringBootTest
:
@SpringBootTest(properties="property.value=dummyValue")
public class FooTest{
@Autowired
Foo foo;
@Test
public void doThat(){
...
}
}
Alternatif olarak kullanabilirsiniz, @TestPropertySource
ancak ek bir ek açıklama ekler:
@SpringBootTest
@TestPropertySource("property.value=dummyValue")
public class FooTest{ ...}
Spring ile (Spring Boot olmadan), biraz daha karmaşık olmalı ama Spring Boot olmadan Spring'i uzun zamandır kullanmadığım için aptalca bir şey söylemeyi tercih etmiyorum.
Bir yan not olarak: @Value
ayarlanacak çok alanınız varsa , ek açıklama eklenmiş bir sınıfa ayıklamak @ConfigurationProperties
daha önemlidir, çünkü çok fazla bağımsız değişkeni olan bir yapıcı istemiyoruz.