Java SpringMVC项目JUnit测试中的@Autowired出现问题
大家好,这里是我的JUnit测试类,它不能自动连接我的DAO类。 下面是我的类和MVC配置的xml文件: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
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&serverTimezone=UTC&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")