2016-02-04 15 views
1

我在写一个使用Spring和DBUnit的集成测试,但是我在@Autowired字段中遇到了一些问题。我认为问题来自于这个字段私人WebApplicationContext wac;我搜索这个问题,尝试很多事情但没有成功。Spring和DbUnit BeanCreationException Java

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; 

    @Autowired 
    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 { 
     this.mockMvc = MockMvcBuilders.webApplicationContextSetup(this.wac).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()))); 
    } 

} 

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:annotation-config /> 
    <mvc:annotation-driven /> 
    <!-- <tx:annotation-driven transaction-manager="transactionManager" /> --> 
    <context:component-scan base-package="test.loginController" /> 

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

堆栈跟踪

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'test.loginController.LoginControllerTest2': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.web.context.WebApplicationContext test.loginController.LoginControllerTest2.wac; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.web.context.WebApplicationContext] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:385) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:127) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:85) 
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:231) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:95) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:139) 
    at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51) 
    at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44) 
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27) 
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37) 
    at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42) 
    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: Could not autowire field: private org.springframework.web.context.WebApplicationContext test.loginController.LoginControllerTest2.wac; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.web.context.WebApplicationContext] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) 
    ... 18 more 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.web.context.WebApplicationContext] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1301) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1047) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533) 
    ... 20 more 
+0

添加'@ service'注释 –

+0

我试过了,但没有奏效。 – RockOrDead

+0

也许它的副本:[link](http://stackoverflow.com/questions/16136376/webappconfiguration-not-injected) –

回答

1

我有固定我的PROBL em像这样...更改classpath:LoginControllerTest2-context.xmlfile:LoginControllerTest2-context.xml。我以相同的方式更改xml文件中的路径。我也更改mockMvc - this.mockMvc = MockMvcBuilders.webApplicationContextSetup(this.wac).build();mockMvc = MockMvcBuilders.webApplicationContextSetup(wac).build();

我使用的一些labraries不兼容,我更改了我使用的版本。

相关问题