Spring Önyükleme Testinde, Yalnızca Adlandırılmış Bileşenler Ekleyerek Temel Spring Uygulama Bağlamı Nasıl Yüklenir?

0

Soru

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ı.

1

En iyi cevabı

0

Daha fazla deneyden sonra bir cevap buldum. Bunun en iyi cevap olup olmadığını söyleyemem, ama özlü ve kesinlikle hile yapıyor...

import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;

// automatically configures validation (implementation of Java Validation API)
@ImportAutoConfiguration(ValidationAutoConfiguration.class)

// obscures/disables any otherwise-automatic web-environment;
// automatically configures logging, loading of external properties, and @Value-plugging;
// and, beyond that, adds to application-context only _cited_ classes/configuration-classes
@SpringBootTest(classes={SomeServiceImpl.class},webEnvironment=WebEnvironment.NONE)// full context loaded, if unqualified

public class SomeServiceTests {
...
}
2021-11-25 08:32:45

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................