2011-11-09 16 views
6

na wiosnę/JUnit można załadować pliki kontekst aplikacji przy użyciu @ContextConfiguration takich jakDynamiczne dodawanie konfiguracji kontekstu sprężyn w środowisku wykonawczym?

@ContextConfiguration({"classpath:a.xml", "classpath:b.xml"}) 

Mam wymóg gdzie jeśli widzę specjalną adnotację w klasie testowej następnie dodać kolejny plik kontekstowe XML dynamicznie. Na przykład:

@ContextConfiguration({"classpath:a.xml", "classpath:b.xml"}) 
@MySpecialAnnotation 
class MyTest{ 
... 
} 

w powyższym przykładzie będę szukać @MySpecialAnnotation i dodać special-context.xml również. Jaki jest najlepszy sposób na zrobienie tego? Patrzyłem na to przez jakiś czas i wydaje mi się, że podklasy mój własny ContextLoader, który jest jednym z parametrów do @ContextConfiguration jest najlepszym podejściem? Czy to jest poprawne? Czy jest lepszy sposób to zrobić?

+0

Co masz na myśli przez dynamiczne. adnotacja jest statyczna, to nie robi zmienić w czasie wykonywania? – Ralph

+0

Oczywiście to jest problem, który próbuję rozwiązać. Chciałbym dynamicznie dodać nowy kontekst do listy plików, które się wczytują. –

+0

Ale jakie jest znaczenie tej adnotacji? Co powinno wywołać "teraz dodaj kontekst x"? – Ralph

Odpowiedz

2

okazuje się, że najlepszym rozwiązaniem jest, aby stworzyć własną ContextLoader. zrobiłem to poprzez rozszerzenie abstrakcyjne jeden.

public class MyCustomContextListener extends GenericXmlContextLoader implements ContextLoader { 
    @Override 
    protected String[] generateDefaultLocations(Class<?> clazz) { 
     List<String> locations = newArrayList(super.generateDefaultLocations(clazz)); 
     locations.addAll(ImmutableList.copyOf(findAdditionalContexts(clazz))); 
     return locations.toArray(new String[locations.size()]); 
    } 

    @Override 
    protected String[] modifyLocations(Class<?> clazz, String... locations) { 
     List<String> files = newArrayList(super.modifyLocations(clazz, locations)); 
     files.addAll(ImmutableList.copyOf(findAdditionalContexts(clazz))); 
     return files.toArray(new String[files.size()]); 
    } 

    private String[] findAdditionalContexts(Class<?> aClass) { 
     // Look for annotations and return 'em 
    } 
} 
+0

Jak dodać i utworzyć przypadek testowy dla tego samego (nie pakiet, ale potrzebujesz przypadku testowego), aby sprawdzić i zweryfikować weryfikację? – Kathir

2

Być może możesz skorzystać ze Spring 3.1 Profiles, aby to osiągnąć.

Jeśli umieścisz fasoli zdefiniowane w specjalnym-context.xml w profilu o nazwie specjalnej można aktywować specjalny profil używając @Profile ("Special) na swojej klasie.

byłoby to usunięcie potrzeba do specjalnego Adnotacja w całości.

Powiązane problemy