Comment faire pour tester les Classes avec @ConfigurationProperties et @Autocâblés
Je veux tester de petites parties de l'application qui s'appuient sur les propriétés chargé avec @Autocâblés et @ConfigurationProperties. Je suis à la recherche d'une solution de chargement que les propriétés requises et pas toujours l'ensemble de l'ApplicationContext.
Ici, comme la réduction de la exemple:
@TestPropertySource(locations = "/SettingsTest.properties")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {TestSettings.class, TestConfiguration.class})
public class SettingsTest {
@Autowired
TestConfiguration config;
@Test
public void testConfig(){
Assert.assertEquals("TEST_PROPERTY", config.settings().getProperty());
}
}
Classe De Configuration:
public class TestConfiguration {
@Bean
@ConfigurationProperties(prefix = "test")
public TestSettings settings (){
return new TestSettings();
}
}
Paramètres De Catégorie:
public class TestSettings {
private String property;
public String getProperty() {
return property;
}
public void setProperty(String property) {
this.property = property;
}
}
Les propriétés de fichier dans le dossier de ressources contient l'entrée:
test.property=TEST_PROPERTY
Dans mon installation actuelle config n'est pas nul, mais pas de champs sont disponibles.
La raison pour laquelle les champs sont pas sur le terrain devrait avoir quelque chose à voir avec le fait que je ne suis pas à l'aide de Springboot mais le Printemps.
Alors quelle serait la Springboot moyen d'obtenir cette course?
edit:
La raison pourquoi je veux faire c'est: j'ai un analyseur qui analyse les fichiers texte, les expressions régulières utilisées sont stockées dans un fichier de propriétés.
Pour tester cela, je voudrais charger uniquement les propriétés requises pour cette analyse qui sont dans le exaple au-dessus de la TestSettings.
En lisant les commentaires, j'ai déjà remarqué que ce sont pas des tests Unitaires plus. Cependant, l'utilisation de la pleine Printemps de configuration de démarrage pour ce petit test semble un peu trop pour moi. C'est pourquoi j'ai demandé si il ya un posibilty pour charger uniquement de la seule classe avec des propriétés.
Whitebox.setInternalState(object, fieldName, value)
méthode à "injecter" des valeurs dans un objet. ExempleVous pourriez avoir un coup d'oeil comment
MockitoAnnotations.initMocks(java.lang.Object)
œuvres et d'étendre à travailler pour @ConfigurationProperties
et @Autowired
(peut déjà y travailler, mais je ne suis pas sûr).Vottner: Merci pour l'astuce. La question est, Ce n'est pas un seul domaine où je veux en moquer, c'est 10. Donc, il serait peu l'écriture de l'effort. Que serait rien à redire, si ce n'est que l'unité de test, mais je veux avoir beaucoup d'entre eux, afin d'avoir un moyen plus facile serait vraiment utile.
Si vous "injecter" le même genre d'objets pour un couple de tests, tout refactoriser l'instruction d'une méthode d'aide et d'appeler cette méthode dans ces tests. Vous pouvez également parametreize cette méthode pour injecter de certains objets. Vous pouvez aussi penser à une sorte de générateur de configuration qui "injecte" valeurs par défaut si aucun constructeur de la méthode spécifique est appelé et définit un béton injecter de la valeur si un respecive builder-méthode a été définie.
Qu'essayez-vous de faire exactement? À partir de l'exemple que j'ai vu on dirait que vous êtes des tests dans le cadre (vous ne devriez pas). Vous pouvez être intéressé par cette réponse de stackoverflow.com/questions/31692863/...
OriginalL'auteur IndianerJones | 2015-07-31
Vous devez vous connecter pour publier un commentaire.
Un couple de points:
Vous n'avez pas besoin d'un "TestConfiguration" class dans votre paquet principal, parce que ca fais de la configuration de la "TestSettings" bean. Vous pouvez le faire simplement en annotant les TestSettings classe elle-même.
Normalement vous devez charger le contexte dont vous avez besoin pour le test à l'aide de la @SpringApplicationConfiguration annotation, en passant le nom de votre classe d'Application. Cependant, vous avez dit que vous ne voulez pas charger l'ensemble de l'ApplicationContext (même si on ne sait pas pourquoi), donc vous avez besoin pour créer une configuration particulière en classe pour faire le chargement que pour les tests. Ci-dessous je l'appelle "TestConfigurationNew" pour éviter la confusion avec le TestConfiguration classe que vous avait à l'origine.
Au Printemps de Démarrage monde, toutes les propriétés sont généralement conservés dans l'application"."propriétés de fichier, mais il est possible de les stocker ailleurs. Ci-dessous, j'ai spécifié "SettingsTest."propriétés de fichier que vous avez proposé. Notez que vous pouvez avoir deux copies de ce fichier, l'un dans la main/dossier de ressources, et l'un dans le test/dossier de ressources pour les tests.
Modifier le code comme suit:
TestSettings.java (dans le paquet principal)
SettingsTest.java (dans le package de test)
TestConfigurationNew.java (dans le package de test):
Cela devrait maintenant fonctionner comme vous le souhaitez.
Je suis d'accord, mais une fois que l'OP a indiqué qu'il est en train de vérifier si oui ou non un paramètre de charge correctement à partir d'un fichier de propriétés, je dirais qu'il a évolué dans le domaine des tests d'intégration et a maintenant besoin d'un contexte plus vaste.
Je suis de java.lang.IllegalStateException: Échec du chargement de l'ApplicationContext à org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124
Est-il possible de charger YML plutôt que des propriétés ?
Cela ne résout pas le problème posé par l'OP, il suffit de fournir une alternative
OriginalL'auteur David H
Vous avez besoin d'annoter votre TestConfiguraion avec
@EnableConfigurationProperties
comme suit:Aussi vous avez seulement besoin d'inclure
TestConfiguration.class
dans@ContextConfiguration
de vousSettingsTest
classe:*.yml
fichiers, il suffit de retirer@TestPropertySource
et ajouter un aspect spécial de l'initialiseur de@ContextConfiguration
comme suit:@ContextConfiguration(classes = TestConfiguration.class, initializers = ConfigFileApplicationContextInitializer.class)
n'oubliez jamais de mettre set et des getters pour les collections 😉
OriginalL'auteur Stepan Kolesnik
vous pouvez en fait juste ajouter @EnableConfigurationProperties à votre @SpringBootTest directement.
par exemple:
OriginalL'auteur Jason