Je voudrais tester la configuration Spring dans le cas de test Junit sans invoquer la méthode init sur les beans configurés. J'aurais pu coder mes méthodes d'initialisation pour ignorer le travail réel basé sur la propriété du système qui aurait pu être définie dans un cas de test mais je cherche une solution plus propre.Spring - Ignorer la méthode init en test unitaire
Répondre
Vos tests JUnit utilisent-ils les mêmes fichiers de configuration de contexte Spring? Je suppose que la réponse est oui ... cela simplifiera le problème si vos tests utilisent une configuration printanière alternative.
L'une des plus propres approches que j'ai utilisé utilise des annotations à portée de main, comme si:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class MovieServiceTest {
// ...
}
appels de printemps ce le « cadre TestContext » et les tests JUnit recherchera un fichier de configuration de contexte ayant, pour l'exemple ci-dessus, le nom "MovieServiceTest-context.xml"
Vous pouvez ensuite définir le bean sans la méthode init. Mais ... tu ne veux pas tester ça aussi?
Est-ce une méthode init spécifiée par l'attribut init-method of bean dans la configuration de Spring XML? Si oui, ne pourriez-vous pas utiliser un contexte XML différent pour exécuter des tests à partir de ce que vous utilisez en production pour y parvenir?
Vous pourriez aller un peu à l'ancienne et étendre la classe en cours de test et remplacer la méthode init.
Ou vous pouvez refactoriser un peu et injecter un objet de stratégie init que la méthode init utilise.
Je préfère la façon testContext.xml si ...
décidé de répondre à ma propre question de partager la solution trouvée. N'aime pas une solution avec le maintien d'une autre copie du fichier de configuration sans init-methods. Ma solution n'est pas parfaite mais fait le travail.
public final static String INIT_METHOD_REGEX = "init-method=\"\\w+\"";
public final static String DESTROY_METHOD_REGEX = "destroy-method=\"\\w+\"";
public final static String PROPERTY_REGEX = "\\$\\{[^\\}]+\\}";
private static List<List<String>> subs = new ArrayList<List<String>>();
static {
subs.add(Arrays.asList(new String[] { INIT_METHOD_REGEX, "" }));
subs.add(Arrays.asList(new String[] { DESTROY_METHOD_REGEX, "" }));
subs.add(Arrays.asList(new String[] { PROPERTY_REGEX, "" }));
}
static public void testSpringConfig(String configFile) throws IOException {
URL springXml = Thread.currentThread().getContextClassLoader().getResource(configFile);
InputStream is = springXml.openStream();
byte[] buffer = new byte[8192];
int readBytes;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while ((readBytes = is.read(buffer)) != -1)
baos.write(buffer, 0, readBytes);
String content = baos.toString();
for (List<String> s : subs)
content = content.replaceAll(s.get(0), s.get(1));
ByteArrayInputStream bais = new ByteArrayInputStream(content.getBytes());
InputSource isrc = new InputSource(bais);
GenericApplicationContext ctx = new GenericApplicationContext();
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx);
xmlReader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_NONE);
xmlReader.loadBeanDefinitions(isrc);
ctx.refresh();
ctx.start();
ctx.close();
}
Cette unité effectue-t-elle des tests ou des tests d'intégration? Si c'est un test unitaire, vous ne devriez pas charger le contexte et vous n'avez donc pas besoin de vous soucier de la méthode init. S'il s'agit de tests d'intégration, c'est-à-dire de tests qui valident l'interaction entre plusieurs de vos classes, vous devez vous assurer que la méthode init est réellement appelée pour garantir un test valide. Tout ce qui a été dit, le gars précédent a frappé le clou, utilise un contexte différent qui n'invoque pas les méthodes init.
- 1. Servlets de test unitaire
- 2. SubSonic GetPaged méthode - différent indice nécessaire dans le test unitaire
- 3. Test unitaire: Maven ou Eclipse?
- 4. Test Grails Spring Integration
- 5. Fonctions de test unitaire reposant sur MouseEventArgs?
- 6. Redéfinition des haricots de printemps dans l'environnement de test unitaire
- 7. Problème lors du test unitaire de la méthode d'arrêt de mon serveur RMI
- 8. GWT Test unitaire TDD et outillage
- 9. Échec du test unitaire en raison d'une erreur de 0,000000001f
- 10. Test unitaire avec un fichier d'entrée
- 11. NSKeyedUnarchiver unarchiveObjectWithFile: retourne zéro dans init: méthode
- 12. Code de test unitaire qui envoie des messages JMS
- 13. constructeur de test unitaire qui utilise My.Settings
- 14. Outil de test unitaire pour la base de données Sybase
- 15. Test de code unitaire qui appelle VirtualPathUtility.ToAbsolute
- 16. Unité Test d'une méthode 'SetDefaults()'
- 17. méthode invoquant bean Spring
- 18. Comment vérifier si une méthode privée a été appelée avec l'argument attendu dans le test unitaire?
- 19. Mocking l'instanciation d'un objet pour un test unitaire
- 20. Vérifiez que l'un ou l'autre méthode a été invoquée dans un test unitaire
- 21. Comment puis-je écrire un test unitaire pour l'événement Gridview_RowCommand?
- 22. Ignorer Test ou TestFixture basé sur la condition
- 23. Spring Web Flow - Comment puis-je configurer un test unitaire avec des valeurs déjà présentes dans conversationScope?
- 24. Aucune méthode Runnable Erreur de la classe de test de base
- 25. Création d'un objet System.Web.Caching.Cache dans un test unitaire
- 26. Meilleur cadre de test unitaire pour l'ancienne école QNX?
- 27. Est-ce trop compliqué d'exécuter le test unitaire avec Valgrind?
- 28. Si vous changez de code avec un test unitaire, lequel changez-vous en premier?
- 29. test unitaire d'écriture pour la création de données persistantes et la suppression
- 30. Comment effectuer un test unitaire pour une application Web?
+1 C'est la meilleure approche –
Pensée de cette approche mais il faudra maintenir 2 versions de la configuration du ressort. Ma stratégie de sauvegarde serait d'enlever toute "init-method" du fichier prod dans le test unitaire, puis de charger le contexte de l'application manuellement. Peut-être que c'est ce que je ferai si aucune meilleure solution n'est trouvée. –
qui est une caractéristique particulièrement funky. Nous avons commencé à nous en tenir à junit3, mais on dirait que junit4 est la voie à suivre. –