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 (@Service
ele cita (e não de cada @Component
, @Controller
e @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.