2016-02-08 174 views
2

我寫這個集成測試,但現在我不知道如何解決這個IllegalStateException這是關於應用程序上下文無法加載。 LoginControllerTest2-context.xml與經過測試的控制器位於同一個包中。SpringFramework集成測試失敗加載ApplicationContext

ControllerTest

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration(locations = { "classpath:LoginControllerTest2-context.xml" }) 
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class, 
     TransactionalTestExecutionListener.class, DbUnitTestExecutionListener.class }) 
@DatabaseSetup("login.xml") 
public class LoginControllerTest2 { 

    private static final String JDBC_DRIVER = "org.h2.Driver"; 
    private static final String JDBC_URL = "jdbc:h2:mem:login;DB_CLOSE_DELAY=-1"; 
    private static final String USER = "sa"; 
    private static final String PASS = ""; 
    private static final String SCHEMA_FILE = "h2.sql"; 
    private static final String DATASET = "login.xml"; 

    private MockMvc mockMvc; 

    @Resource 
    private WebApplicationContext wac; 

    @BeforeClass 
    public static void createSchema() throws ClassNotFoundException { 
     Class.forName(JDBC_DRIVER); 
     try { 
      Connection conn = dataSource().getConnection(); 
      InputStreamReader in = new InputStreamReader(LoginControllerTest2.class.getResourceAsStream(SCHEMA_FILE)); 
      RunScript.execute(conn, in); 
     } catch (Exception e) { 
      // TODO: handle exception 
     } 
    } 

    @Before 
    public void loadTestData() throws Exception { 
     // mockMvc = 
     // MockMvcBuilders.xmlConfigSetup("classpath:LoginControllerTest2-context.xml").build(); 

     mockMvc = MockMvcBuilders.webApplicationContextSetup(wac).build(); 

     // mockMvc = 
     // MockMvcBuilders.annotationConfigSetup(LoginControllerTest2.class).build(); 

     IDataSet ids = new FlatXmlDataSetBuilder().build(LoginControllerTest2.class.getResourceAsStream(DATASET)); 
     JdbcDatabaseTester databaseTester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASS); 
     databaseTester.setSetUpOperation(org.dbunit.operation.DatabaseOperation.CLEAN_INSERT); 
     databaseTester.setDataSet(ids); 
     databaseTester.onSetup(); 
    } 

    private static DataSource dataSource() { 
     JdbcDataSource dataSource = new JdbcDataSource(); 
     dataSource.setURL(JDBC_URL); 
     dataSource.setUser(USER); 
     dataSource.setPassword(PASS); 
     return dataSource; 
    } 

    @Test 
    @ExpectedDatabase("login.xml") 
    public void testShowForm() throws Exception { 
     mockMvc.perform(get("/login")).andExpect(status().isOk()).andExpect(view().name("/login")) 
       .andExpect(forwardedUrl("../../WebContent/j/login.jsp")) 
       .andExpect(model().attribute("form", hasProperty("passportId", nullValue()))) 
       .andExpect(model().attribute("form", hasProperty("email", isEmptyOrNullString()))) 
       .andExpect(model().attribute("form", hasProperty("username", isEmptyOrNullString()))) 
       .andExpect(model().attribute("form", hasProperty("hostname", isEmptyOrNullString()))) 
       .andExpect(model().attribute("form", hasProperty("pass", isEmptyOrNullString()))); 
    } 

} 

堆棧跟蹤

java.lang.IllegalStateException: Failed to load ApplicationContext 
    at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:94) 
    at org.springframework.test.context.DefaultTestContext.getApplicationContext(DefaultTestContext.java:72) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) 
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:212) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:200) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:259) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:261) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:219) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:83) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:68) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:163) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.jdbc.datasource.init.DataSourceInitializer#0': Invocation of init method failed; nested exception is org.springframework.jdbc.datasource.init.CannotReadScriptException: Cannot read SQL script from ServletContext resource [/test/loginController/h2.sql]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/test/loginController/h2.sql] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
    at org.springframework.test.context.web.AbstractGenericWebContextLoader.loadContext(AbstractGenericWebContextLoader.java:133) 
    at org.springframework.test.context.web.AbstractGenericWebContextLoader.loadContext(AbstractGenericWebContextLoader.java:60) 
    at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:109) 
    at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:261) 
    at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:68) 
    at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:86) 
    ... 26 more 
Caused by: org.springframework.jdbc.datasource.init.CannotReadScriptException: Cannot read SQL script from ServletContext resource [/test/loginController/h2.sql]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/test/loginController/h2.sql] 
    at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:437) 
    at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.populate(ResourceDatabasePopulator.java:229) 
    at org.springframework.jdbc.datasource.init.CompositeDatabasePopulator.populate(CompositeDatabasePopulator.java:60) 
    at org.springframework.jdbc.datasource.init.DatabasePopulatorUtils.execute(DatabasePopulatorUtils.java:48) 
    at org.springframework.jdbc.datasource.init.DataSourceInitializer.execute(DataSourceInitializer.java:108) 
    at org.springframework.jdbc.datasource.init.DataSourceInitializer.afterPropertiesSet(DataSourceInitializer.java:93) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570) 
    ... 41 more 
Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/test/loginController/h2.sql] 
    at org.springframework.web.context.support.ServletContextResource.getInputStream(ServletContextResource.java:141) 
    at org.springframework.core.io.support.EncodedResource.getReader(EncodedResource.java:138) 
    at org.springframework.jdbc.datasource.init.ScriptUtils.readScript(ScriptUtils.java:274) 
    at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:434) 
    ... 48 more 

XML

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd 
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd 
      http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd 
      http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> 

    <context:component-scan base-package="test.loginController" /> 
    <context:annotation-config /> 
    <mvc:annotation-driven /> 
    <context:spring-configured /> 
    <!-- <tx:annotation-driven transaction-manager="transactionManager" /> --> 

    <bean id="dataSource" 
     class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy"> 
     <constructor-arg> 
      <bean class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> 
       <property name="driverClass" value="org.h2.Driver" /> 
       <property name="url" 
        value="jdbc:h2:mem:login;DB_CLOSE_DELAY=-1;TRACE_LEVEL_SYSTEM_OUT=2;TRACE_LEVEL_FILE=4" /> 
       <property name="username" value="sa" /> 
       <property name="password" value="" /> 
      </bean> 
     </constructor-arg> 
    </bean> 

    <jdbc:initialize-database data-source="dataSource"> 
     <jdbc:script location="/test/loginController/h2.sql" /> 
    </jdbc:initialize-database> 

</beans> 
+0

請參閱這裏:'無法打開ServletContext資源[/test/loginController/h2.sql]' – Jens

+0

@Jens我看到了,但路徑是正確的。 – RockOrDead

回答

0

某處在你的代碼,您正試圖從ServletContext中查找/test/loginController/h2.sql

我不熟悉MockMvc,但我猜你需要告訴它你的測試web根目錄在哪裏,以便ServletContext.getResource(...)可以找到該文件。

+0

我編輯了我的問題。在xml文件中,我指定了h2.sql的位置,但路徑是正確的。我想getResourceAsStream()必須找到它。 – RockOrDead

+0

我不知道爲什麼它試圖從ServletContext訪問。你應該嘗試'location =「classpath:/ test/loginController/h2.sql'。另外,確保h2.sql位於'src/test/resources'下面 –

相關問題