Java SpringMVC项目JUnit测试中的@Autowired出现问题

Java SpringMVC项目JUnit测试中的@Autowired出现问题,java,hibernate,spring-mvc,junit,autowired,Java,Hibernate,Spring Mvc,Junit,Autowired,大家好,这里是我的JUnit测试类,它不能自动连接我的DAO类。 下面是我的类和MVC配置的xml文件: import java.util.List; import org.springframework.stereotype.Component; import com.luv2code.springdemo.entity.Address; public interface AddressDAO { public List<Address> findAllAdrr

大家好,这里是我的JUnit测试类,它不能自动连接我的DAO类。 下面是我的类和MVC配置的xml文件:


import java.util.List;

import org.springframework.stereotype.Component;

import com.luv2code.springdemo.entity.Address;


public interface AddressDAO {

    public List<Address> findAllAdrressesOfCustomer(int customerId);

}
这里是我的xml配置文件:

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

    <!-- Add support for component scanning -->
    <context:component-scan base-package="com.luv2code.springdemo" />

    <!-- Add support for conversion, formatting and validation support -->
    <mvc:annotation-driven/>

    <!-- Define Spring MVC view resolver -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <!-- Step 1: Define Database DataSource / connection pool -->
    <bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
          destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="jdbc:mysql://localhost:6703/my_first_db?useSSL=false&amp;serverTimezone=UTC&amp;allowPublicKeyRetrieval=true" />
        <property name="user" value="root" />
        <property name="password" value="24081983" /> 

        <!-- these are connection pool properties for C3P0 -->
        <property name="minPoolSize" value="5" />
        <property name="maxPoolSize" value="20" />
        <property name="maxIdleTime" value="30000" />
    </bean>  

    <!-- Step 2: Setup Hibernate session factory -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="dataSource" ref="myDataSource" />
        <property name="packagesToScan" value="com.luv2code.springdemo.entity" />
        <property name="hibernateProperties">
           <props>
              <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
              <prop key="hibernate.show_sql">true</prop>
           </props>
        </property>
   </bean>    

    <!-- Step 3: Setup Hibernate transaction manager -->
    <bean id="myTransactionManager"
            class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <!-- Step 4: Enable configuration of transactional behavior based on annotations -->
    <tx:annotation-driven transaction-manager="myTransactionManager" />

    <!-- Add support for reading web resources: css, images, js, etc ... -->
    <mvc:resources location="/resources/" mapping="/resources/**"></mvc:resources>



</beans>

在此,我还提供了我的项目结构:

显然stacktrace说Spring不能自动连接AddressDAO类,因为他找不到它,尽管它在那里并且被正确地注释了。
您对可能导致此问题的原因有何建议?

尝试使用@Mock anotation而不是@Autowired。此外,要测试存储库,您还应保留预期结果:

when(myAddressDao.findAllAdrressesOfCustomer("id").thenReturn("your expected rusult")

尝试使用@Mock anotation而不是@Autowired。此外,要测试存储库,您还应保留预期结果:

when(myAddressDao.findAllAdrressesOfCustomer("id").thenReturn("your expected rusult")


如果未找到文件,您对
classpath*:
的使用将自动返回,不会出现任何错误,可能是因为未扫描子目录,也可能是因为找不到xml。尝试使用
classpath*:com/**/.xml

如果未找到文件,您使用的
classpath*:
将自动返回,不会出现任何错误,可能是因为它未扫描子目录,也无法找到xml。尝试使用
classpath*:com/**/.xml

我不确定为什么您有一个*there
@ContextConfiguration(locations=“classpath*:spring mvc
?如果我不使用它,我会得到以下消息:
java.io.FileNotFoundException:类路径资源[spring-mvc-crud-demo-servlet\u test.xml]无法打开,因为它不存在
好的,我知道了。顺便说一句,我看到这段代码来自我的教程,我喜欢那个家伙。但我记得他没有介绍maven和Junit。重点是maven的文件夹结构更加一致和严格。我建议有一个单独的测试文件夹和它的resources文件夹你可以稍后再研究它,使用maven/gradle,你的资源将正常加载是的,你是对的,我只是想使用一个老式的项目,我已经研究了spring boot,它可以非常直接地工作,而不必做所有这些配置。我不确定你为什么有一个*there
@ContextConfiguration(locations=”classpath*:spring mvc
?如果我不使用它,我会收到以下消息:
java.io.FileNotFoundException:class path resource[spring-mvc-crud-demo-servlet_test.xml]无法打开,因为它不存在
好的,我知道了。顺便说一句,我看到这段代码来自我的教程,我喜欢那个家伙。但我记得他没有介绍maven和Junit。重点是maven的文件夹结构更加一致和严格。我建议有一个单独的测试文件夹和它的resources文件夹你可以稍后再研究它,使用maven/gradle,你的资源将正常加载是的,你是对的,我只是想使用一个老式的项目,我已经研究了spring boot,它可以非常直接地工作,不需要做所有这些配置。模仿你正在测试的类不会测试该类。@Beundead,是的,我明白了目前这种回购协议返回硬编码的值,但这就是人们通常测试回购协议的方式,如果你想测试你的回购协议,在你的情况下,最好的方式是repo repo=new repo(),然后验证您的方法返回值。您无法在测试中自动连接bean,即使您以某种方式这样做,这将是错误的方法和代码样式。您好@Oleg。
@RunWith(SpringJUnit4ClassRunner.class)
部分应该启用
@Autowired
-ing将元素自动连接到测试类中。(虽然我同意我通常更喜欢直接的单元测试。)模仿你正在测试的类不会测试那个类。@Beundead,是的,我看到目前这个repo返回硬编码的值,但这就是人们通常测试repo的方式,如果你想测试你的repo,最好的方法是repo repo=new repo(),然后验证您的方法返回值。您无法在测试中自动连接bean,即使您以某种方式这样做,这将是错误的方法和代码样式。您好@Oleg。
@RunWith(SpringJUnit4ClassRunner.class)
部分应该启用
@Autowired
-ing将元素自动连接到测试类中。(尽管我同意我通常更喜欢直接的单元测试。)你是我的人!!!!!谢谢你为我工作的Yuvaraj!但是我不明白,为什么他找不到我的xml呢?
classpath*:
prefix只是说,在同一位置的不同组件中查找xml,后跟前缀,并将其合并到一个上下文中,而
classpath*:
prefix之后的通配符用法则会这样做更复杂的模式匹配,看-你是我的人!!!!!谢谢你为我工作的Yuvaraj!但我不明白,为什么他找不到我的xml?
classpath*:
前缀只是说,从同一位置找到xml的不同组件,后跟前缀,并将其组合到一个上下文中,而通配符usage在
classpath*之后:
前缀进行更复杂的模式匹配,请参阅-
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.luv2code.springdemo.test.AddressDaoLayerTester': Unsatisfied dependency expressed through field 'myAddressDao'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.luv2code.springdemo.dao.AddressDAO' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:116)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1422)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:393)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:119)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83)
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:244)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
    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.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
    at org.junit.vintage.engine.execution.RunnerExecutor.execute(RunnerExecutor.java:40)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
    at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
    at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
    at org.junit.vintage.engine.VintageTestEngine.executeAllChildren(VintageTestEngine.java:80)
    at org.junit.vintage.engine.VintageTestEngine.execute(VintageTestEngine.java:71)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229)
    at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197)
    at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:137)
    at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:89)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.luv2code.springdemo.dao.AddressDAO' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1695)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1253)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1207)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640)
    ... 48 more
when(myAddressDao.findAllAdrressesOfCustomer("id").thenReturn("your expected rusult")