Orijinal
Bir Spring Boot (v2.3.8) uygulamasının bir testinde, yalnızca temel bir Spring uygulama bağlamında adlandırılmış bileşenleri yüklemeye çalışıyorum. Daha spesifik olarak, bir testte, en azından günlüğe kaydetmeyi, harici özelliklerin yüklenmesini, doğrulamayı (Java Doğrulama API'sı aracılığıyla) yapılandıran bir Spring uygulama bağlamı yüklemek istiyorum ve @Value
-takmayı ancak MVC, Veri JPA vb. Olmadan. Özünde, kısıtlama açıklamalı bir arayüz üzerinden test etmek istiyorum (örn. @NotBlank
), bir @Service
bu, yalnızca yerel dosya sistemini (MVC, Veri JPA veya başka bir Bahar Önyükleme Testi "dilimi" yok) kullanır ve doldurulan bir veri üyesine sahiptir @Value
.
Boşuna, farklı kombinasyon alt kümelerinde birçok ek açıklama (ve bazı doğal nitelikleri) denedim: örn. @SpringBootTest
, @Configuration
, @ContextConfiguration
, @TestConfiguration
, @TypeExcludeFilters
vb. Örneğin:
@Validated
public interface SomeService {
String someMethod (@NotBlank String someParam);
}
...
@Service
public class SomeServiceImpl implements SomeService {
@Value("${some.value}")
private String someValue;
@Override
public String someMethod(String someParam) {
// do something with local file-system,
// with someValue in hand, and
// knowing someParam not blank
}
}
...
@SpringBootTest(classes={SomeServiceImpl.class},webEnvironment=WebEnvironment.NONE)
class SomeServiceTests {
@Autowired
private SomeService someService;
@Test
void throwConstraintViolationException_whenSomeParamNil() {
assertThrows(
ConstraintViolationException.class,
()->someService.someMethod(new String()));
}
...
}
Bu örnekte, öznitelik classes
-den @SpringBootTest
belirtilen sınıfı yükler, ancak tüm temelleri (günlüğe kaydetme, doğrulama vb.) Gizler. da aradığım bu.
Craig Walls'ın "Spring Boot in Action" adlı kitabından bir sonraki alıntı tam olarak aradığım şey gibi görünüyor, ancak ana aracı (@SpringApplicationConfiguration
şimdi (ve resmen kendi önerilmiyor-yedek önerilir - @SpringBootTest
- en azından nitelikle ilgili olarak eşit davranmaz classes
):
@ContextConfiguration, Spring uygulamasını yüklemek için harika bir iş çıkarmasına rağmen bağlam, tam Yaylı Önyükleme işlemiyle yüklemez...Baharuygulaması sadece uygulama bağlamını yüklemekle kalmaz, aynı zamanda günlüğe kaydetmeyi, harici yüklemeyi de sağlar özellikler (uygulama.özellikler veya uygulama.yml) ve Baharın diğer özellikleri Önyüklemek. @ContextConfiguration kullanıyorsanız, bu özellikleri alamazsınız. Bu özellikleri tümleştirme testlerinize geri almak için, Spring Boot'un @ SpringApplicationConfiguration için @ contextconfiguration'ı değiştirebilirsiniz:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes=AddressBookConfiguration.class)
public class AddressServiceTests {
...
}
Orada, "tam Yaylı Önyükleme işlemini" alır, ancak yalnızca sınıfı ekler (@Service
) o (her değil) alıntı yapar @Component
, @Controller
, ve @Repository
onun etki alanının).
Bugün, kullanımdan kaldırılmadan nasıl yapılır @SpringApplicationConfiguration
?
Güncelleme
Başlangıçta (Craig Walls'ın değil) örneğimin (yani @SpringBootTest(classes={SomeServiceImpl.class},webEnvironment=WebEnvironment.NONE)
belirtilen sınıfı yüklemesine rağmen, Spring Boot'un normalde yükleyeceği bir uygulama bağlamının tüm temellerini gizledi. Daha fazla deney yaparak, bu ifadenin yanlış olduğunu, hepsinin değil, yalnızca bazı temellerin gizlendiğini, yani doğrulamanın (Java Doğrulama apı'sinin uygulanması) yanlış olduğunu buldum. Başka bir deyişle, günlüğe kaydetme, harici özelliklerin yüklenmesi ve @ Value-plugging gerçekten de yüklenir / yapılandırılır. Sanırım birçok permütasyon / denememde kafam karışmış olmalı.