2010-12-07 3 views
43

のための適切な場所を置くために、私たちは、コントローラは、この例外はnullを返します春@ContextConfigurationどのように私たちのプロジェクトでは、XML

@Test 
    public void controllerReturnsModelToOverzichtpage() 
    { 
     ModelAndView modelView = new ModelAndView(); 
     KlasoverzichtController controller = new KlasoverzichtController(); 
     modelView = controller.showOverzicht(); 

     assertEquals("Klasoverzichtcontroller returns the wrong view ", modelView.getViewName(), "overzicht"); 
    } 

右のモデルビューを返すかどうかを確認するためのテストを足すされています。

は現在@contextconfigurationを設定しているが、我々は、メインの\ webappの\ルート\ WEB-INF \のルートのcontext.xml \ SRCにあり、右のXMLをロードする方法がわからない

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
public class TestOverzichtSenario{ 
.... 

This documentation isn't clear enough to understand

コンテキスト注釈が正しいxmlを読み込む方法を教えてください。

編集v2の

私はWEBINFフォルダから

src\main\resources\be\..a bunch of folders..\configuration\*.xml 

に設定.xmlファイルをコピーして

<param-name>contextConfigLocation</param-name> 
<param-value> 
      classpath*:configuration/root-context.xml 
      classpath*:configuration/applicationContext-security.xml 
     </param-value> 

にWEBINFにweb.xmlファイルを変更し、現在入手しますエラー

org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml] 
    org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:341) 
    org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302) 
    org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143) 
    org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178) 
    org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149) 
    org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:124) 
    org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:93) 
    org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130) 
    org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:467) 
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:397) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:442) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:458) 
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:339) 
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:306) 
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:127) 
    javax.servlet.GenericServlet.init(GenericServlet.java:212) 
    com.springsource.insight.collection.tcserver.request.HttpRequestOperationCollectionValve.invoke(HttpRequestOperationCollectionValve.java:80) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) 
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:379) 
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    java.lang.Thread.run(Unknown Source) 

答えて

37

これは、構成をwebappに入れない理由です。

私が知る限り、ユニットテストからwebappフォルダのファイルにアクセスする良い方法はありません。代わりにsrc/main/resourcesに設定を入れることができるので、単体テスト(docsで説明されているように)とwebapp(プレフィックスを使用してcontextConfigLocationを使用)からアクセスすることができます。

も参照してください:

+1

"classpath:"とは何かのドキュメントを参照していますか? – David

+0

@Dvd Prd: – axtavt

+0

thxさん、私の変更を確認できますか? – David

19

これは私が考えるMavenの特定の問題です。 Mavenはファイル/src/main/resourcesをtarget-testフォルダにコピーしません。あなたは絶対にこのようにしたい場合は、リソースプラグインを設定することでこれを自分で行う必要があります。

簡単な方法ではなく経由/src/test/resourcesディレクトリおよび負荷テストの特定のコンテキスト定義を置くことです:

@ContextConfiguration(locations = { "classpath:mycontext.xml" }) 
+0

/src/main/resourcesをtarget/test-classesにコピーしないでください。テストクラス –

+4

/src/main/resourcesをtarget/test-classesフォルダにコピーしないでください**。 test-classesはテストリソース、つまりsrc/test/javaとsrc/test/resourcesのためのものです。テスト実行時にsrc/main/resourcesがtarget/classesにコピーされ、target/classesがクラスパスに置かれるため、src/main/resourcesの任意のスプリングコンテキストファイルをクラスパスリソースとしてユニットテストにロードできます。 src/main/resources/spring/my-context.xmlは@ContextConfiguration({"/ spring/my-context.xml"})としてロードできます。 –

+0

@ Dan:私はそう思います。 'test'コンテキストで' main'の設定を再利用すると、maven-resources-pluginを使用して、既存のファイルをテスト用にコピーさせることは意味があります。だから、 "すべきではない**"という言葉をコピーするのはちょっと過酷です。もちろんMavenはこれをデフォルトでは行いませんが、自分で行う理由があれば...どうしてですか? – fasseg

5

我々が使用します。

@ContextConfiguration(locations="file:WebContent/WEB-INF/spitterMVC-servlet.xml") 

プロジェクトはEclipseの動的Webプロジェクトです、パスは次のようになります。

{project name}/WebContent/WEB-INF/spitterMVC-servlet.xml 
66

テストは次のようになります(Mアヴェンとスプリング3。1):

@ContextConfiguration 
(
    { 
    "classpath:beans.xml", 
    "file:src/main/webapp/WEB-INF/spring/applicationContext.xml", 
    "file:src/main/webapp/WEB-INF/spring/dispatcher-data-servlet.xml", 
    "file:src/main/webapp/WEB-INF/spring/dispatcher-servlet.xml" 
    } 
) 
@RunWith(SpringJUnit4ClassRunner.class) 
public class CCustomerCtrlTest 
{ 
    @Resource private ApplicationContext m_oApplicationContext; 
    @Autowired private RequestMappingHandlerAdapter m_oHandlerAdapter; 
    @Autowired private RequestMappingHandlerMapping m_oHandlerMapping; 
    private MockHttpServletRequest m_oRequest; 
    private MockHttpServletResponse m_oResp; 
    private CCustomerCtrl m_oCtrl; 

// more code .... 
} 
+0

ありがとうございました – David

+0

ありがとう、私の問題を解決!しかし、あなたは "ファイル:パス"というアプローチが正しいと思いますか? – Andrew

4

から

@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/applicationContext.xml" }) 

であるあなたがテストのためのアプリ-のcontext.xmlから独立しており、テストのcontext.xmlを作成しようとしていると仮定し、 test-context.xmlを/ src/test/resourcesの下に置きます。テストクラスでは、@ContextConfigurationアノテーションをクラス定義の上に置きます。

@ContextConfiguration(locations = "/test-context.xml") 
public class MyTests { 
    ... 
} 

スプリング文書Context management

0

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(位置= { "/Beans.xml"}) パブリッククラスDemoTest {}

2

からファイルをロードします。 {project}/src/main/webapp/WEB-INF/spring-dispatcher-servlet.xml

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring-dispatcher-servlet.xml" })  
@WebAppConfiguration 
public class TestClass { 
    @Test 
    public void test() { 
     // test definition here..   
    } 
} 
-1

時にはそれがテストclasssesフォルダによるトンであなたのリソースファイルを欠落しているような非常に単純なものであるかもしれませんいくつかのクリーンアップ。

関連する問題