2012-04-30 13 views
20

Kiedy uruchomić mojej aplikacji na Tomcat plik wiosna-context.xml znajduje sięPołożenie wiosenno-context.xml

/WEB-inf/spring-context.xml

This jest w porządku. Ale działa test junit muszę dostarczyć jej położenia mojego wiosna-test-context.xml jak ten:

@ContextConfiguration(locations={"classpath:/spring-test-context.xml"}) 

Jedyny sposób to działa to, jeśli plik znajduje się w

/src/spring-context.xml

Jak mogę dostać mój wniosek, aby znaleźć moje pliki wiosna-context w tym samym miejscu? Czy to działa z junit testes i wdrażane na tomcat?

Próbowałem to i to dało mi dużo błędów o nie znalezieniu jakichkolwiek fasolę, ale to nie znaczy, że nie może znaleźć pliku ..

classpath:/WEB-INF/spring-test-context.xml 

Odpowiedz

38

Zgodnie z sugestią duffymo, struktura Spring TestContext Framework (TCF) zakłada, że ​​lokalizacje łańcuchów domyślnie znajdują się w ścieżce klasy. Aby uzyskać szczegółowe informacje, patrz JavaDoc dla ContextConfiguration.

Należy jednak pamiętać, że można również określać zasoby w systemie plików za pomocą bezwzględnej lub względnej ścieżki przy użyciu abstrakcji zasobów Spring (tzn. Za pomocą prefiksu "file:"). Możesz znaleźć szczegóły na ten temat w JavaDoc dla metody modifyLocations() w Spring's AbstractContextLoader.

Tak na przykład, jeśli plik konfiguracyjny XML znajduje się w "src/main/webapp/WEB-INF/spring-config.xml" w folderze projektu, można określić lokalizację jako względną ścieżkę systemu plików w następujący sposób:

@ContextConfiguration("file:src/main/webapp/WEB-INF/spring-config.xml") 

Jako alternatywę można przechowywać pliki konfiguracyjne Wiosna w ścieżce klas (np src/main/resources), a następnie odwoływać się do nich poprzez ścieżki klasy w konfiguracji Wiosna MVC - na przykład:

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath:/spring-config.xml</param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

z tym podejściem, nasz test config uration po prostu wyglądać następująco (zauważ, że wiodącą ukośnik oznacza, że ​​zasób jest w głównym ścieżki klasy):

@ContextConfiguration("/spring-config.xml") 

Można również znaleźć sekcję Context configuration with XML resources z podręcznika użytecznego.

Pozdrawiam,

Sam

(autor ram Wiosna TestContext)

+0

doskonała. Działa z 'file: WebContent/WEB-INF/spring-context.xml' (nie używając programu maven). Dzięki za pomoc! – Tommy

+0

Należy wspomnieć, że Spring jakoś wie, gdzie znajduje się "src /". W moim ustawieniu mvn3/surefire/Spring działa to również (i zapobiega podwojeniu pliku zasobów), ale podejrzewam, że Surefire przygotowuje kontekst dla Spring w taki sposób, że "src /" jest prawidłowym początkiem (i "main /" nie być). Dlatego powinieneś wiedzieć, gdzie musi się rozpocząć twoja "względna" ścieżka, aby to zadziałało. –

+0

'@ ContextConfiguration' obsługuje atrybut' classes' dla JavaConfig od wersji 3.1: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/ContextConfiguration.html# classes- –

10

Problem polega na tym, że/WEB-INF nie znajduje się w CLASSPATH dla aplikacji internetowej. Jednak/WEB-INF/classes jest.

Twój problem z testowaniem polega na tym, że nie pracujesz na serwerze aplikacji, więc WEB-INF/classes nie jest domyślnie częścią CLASSPATH. Zalecam skonfigurowanie testów tak, aby WEB-INF/classes znajdowało się w teście CLASSPATH lub używało względnej lub bezwzględnej ścieżki do pliku, aby je znaleźć.

Powiązane problemy