Jak pobrać w teście pobrania Spring podstawowych aplikacji Spring-Kontekst, Dodając tylko Nazwane elementy?

0

Pytanie

Oryginał

Próbuję pobrać w teście aplikacji Spring Boot (v2.3.8) tylko nazwane elementy w podstawowym kontekście aplikacji Spring. Bardziej konkretnie, chcę pobrać w teście kontekst aplikacji Spring, który dostosowuje się, co najmniej, rejestrowanie, pobieranie zewnętrznych właściwości, sprawdzenie (poprzez API do sprawdzania Java) i @Value-połączenie, ale bez MVC, JPA danych, itp. W rzeczywistości, chcę przetestować za pomocą interfejsu z adnotacjami ograniczeń (np. @NotBlank), a @Service to korzysta tylko z lokalnego systemu plików (bez MVC, JPA danych lub innego "cięcia" testu pobrania Spring) i ma jeden element danych, wypełniony przez @Value.

Ja bezskutecznie próbowałem wiele komentarzy (i niektóre z przypisywanych im atrybutów) w różnych kombinacjach-różnych podzbiorach: np. @SpringBootTest, @Configuration, @ContextConfiguration, @TestConfiguration, @TypeExcludeFilters itp., Np.:

@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()));
    }
    ...
}

W tym przykładzie atrybut classes od @SpringBootTest ładuje to klasa, ale ukrywa wszystkie podstawy (prowadzenie magazynu, kontrola itp.), Które ja również szukam.

Następujący fragment z książki Craiga Уоллса "Sprężynowy butów w akcji" wydaje się właśnie to, czego szukam, ale jego podstawowym narzędziem (@SpringApplicationConfiguration) teraz jest nieaktualny (i go oficjalnie zalecana wymiana - @SpringBootTest - nie zachowuje się tak samo, przynajmniej w odniesieniu do atrybutu classes):

Chociaż @ContextConfiguration radzi sobie z pobieraniem kontekst aplikacji Spring, że nie pobiera go z pełnym obciążeniem Spring...SpringApplication nie tylko pobiera kontekst aplikacji, ale także pozwala prowadzić dziennik, pobierać zewnętrzne właściwości (application.properties (właściwości) lub application.yml) i inne funkcje Spring Boot. Jeśli używasz @ContextConfiguration, nie dostaniesz tych funkcji. Aby przywrócić te funkcje w swoje imprezy integracyjne, testy, można wymienić @ContextConfiguration na @SpringApplicationConfiguration Spring Boot:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes=AddressBookConfiguration.class)
public class AddressServiceTests {
...
}

Tam dostaje "pełną obsługę wiosennej pobrania", ale dodaje tylko klasa ( -@Service) cytuje (nie każdy @Component, @Controlleri @Repository jego włości).

Jak to zrobić dzisiaj, bez starszych @SpringApplicationConfiguration?

Zaktualizować

Początkowo oświadczył, że mój (nie Craiga Уоллса) przykład (a mianowicie @SpringBootTest(classes={SomeServiceImpl.class},webEnvironment=WebEnvironment.NONE)choć pobrał klasa, ukrył wszystkie podstawy kontekstu aplikacji, który zazwyczaj jest ładowany podczas uruchamiania Spring. W trakcie dalszych eksperymentów okazało się, że to stwierdzenie było niedokładne, ponieważ nie wszystkie, a tylko niektóre podstawy ukryte, a mianowicie sprawdzanie (implementacja API do sprawdzania Java). Innymi słowy, rejestrowanie, uruchamianie zewnętrznych właściwości i podłączenie @Value naprawdę pobrane/skonfigurowane. Myślę, że musi być zagubiony we wszystkich moich licznych logistyce/próbach.

1

Najlepsza odpowiedź

0

Po jeszcze kilku eksperymentów znalazłem odpowiedź. Nie mogę powiedzieć, czy jest to najlepszy odpowiedź, ale jest lakoniczne i na pewno robi swoje...

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

W innych językach

Ta strona jest w innych językach

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