2009-07-02 6 views
0

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

3

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?

+0

+1 C'est la meilleure approche –

+0

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. –

+0

qui est une caractéristique particulièrement funky. Nous avons commencé à nous en tenir à junit3, mais on dirait que junit4 est la voie à suivre. –

1

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?

0

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 ...

0

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

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.

Questions connexes