Como Carga, na Primavera de Teste de Arranque, Basic Aplicativo Spring-Contexto, a Adição de Apenas Chamado de Veículo?

0

Pergunta

Original

Estou tentando carregar, em um teste de uma Mola de Inicialização (v2.3.8) aplicação, chamado somente de componentes em um básicas do aplicativo Spring-contexto. Mais especificamente, eu quero de carga, em um teste, um aplicativo Spring-contexto que configura, no mínimo, de registo, de carregamento de propriedades externas, validação (através da Java API de Validação), e @Value-ligar mas sem MVC, Dados JPA, etc. Em essência, eu quero testar, através de uma restrição anotada interface (e.g. @NotBlank), uma @Service que exerce apenas o sistema de arquivos local (não MVC, Dados JPA, ou qualquer outra Primavera o Teste de Arranque "fatia") e tem um tipo de dados-membro preenchidas através @Value.

Eu tentei, sem sucesso, muitas anotações (e alguns de seus atributos inerentes), em combinação diferente-subconjuntos: e.g. @SpringBootTest, @Configuration, @ContextConfiguration, @TestConfiguration, @TypeExcludeFilters, etc. Por exemplo:

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

Neste exemplo, o atributo classes de @SpringBootTest carrega o citado classe, mas obscurece todas as noções básicas (de registo, validação, etc.) que eu também estou procurando.

O seguinte trecho, de Craig Paredes' "Primavera de Inicialização em Ação", parece ser exatamente o que eu estou buscando, mas a sua principal ferramenta (@SpringApplicationConfiguration) já está obsoleta (e sua oficialmente recomendado substituição - @SpringBootTest - NÃO se comportam igualmente, pelo menos com relação atributo classes):

Apesar @ContextConfiguration faz um ótimo trabalho de carregar o aplicativo Spring contexto, não carregá-lo com a plena Primavera de Inicialização tratamento...SpringApplication não apenas carrega o contexto de aplicação, mas também permite o registro em log, o carregamento externo as propriedades de aplicação.propriedades ou aplicação.yml), e outras características da Primavera De inicialização. Se você estiver usando o @ContextConfiguration, você não vai ter esses recursos. Para obter esses recursos em seus testes de integração, você pode trocar @ContextConfiguration para a Primavera de Inicialização do @SpringApplicationConfiguration:

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

Lá, ele recebe a "Primavera de Inicialização do tratamento", mas adicionando apenas a classe (@Serviceele cita (e não de cada @Component, @Controllere @Repository de seu domínio).

Como fazer isso hoje, sem preterido @SpringApplicationConfiguration?

Atualização

Originalmente, eu afirmei que a minha (não Craig Paredes') exemplo (nomeadamente @SpringBootTest(classes={SomeServiceImpl.class},webEnvironment=WebEnvironment.NONE), apesar de carregado o citado classe, obscurecido todas as noções básicas de uma aplicação em contexto de que a Primavera de Inicialização normalmente seria de carga. Através de novas experiências, descobri que essa foi uma afirmação imprecisa, em que não todos , mas, apenas, alguns dos princípios básicos são obscurecidos, nomeadamente de validação (implementação de Java API de Validação). Em outras palavras, extração, carregamento de propriedades externas, e @Valor de obturação são, de fato, carregado/configurado. Eu acho que deve ter ficado confuso, em todos os meus muitos de permutações tentativas.

1

Melhor resposta

0

Depois ainda mais a experimentação, eu encontrei uma resposta. Eu não posso dizer se é a melhor resposta, mas é concisa e certamente faz o truque...

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

Em outros idiomas

Esta página está em outros idiomas

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