Java JUnit4看不到bean
我在类中使用@Bean和@Annotation,如下所示:Java JUnit4看不到bean,java,hibernate,spring,unit-testing,junit,Java,Hibernate,Spring,Unit Testing,Junit,我在类中使用@Bean和@Annotation,如下所示: @Transactional @Configuration public class UserDAO { @Bean public UserDAO userDAO() { return new UserDAO(); } private HibernateTemplate hibernateTemplate; @Autowired public void setS
@Transactional
@Configuration
public class UserDAO {
@Bean
public UserDAO userDAO()
{
return new UserDAO();
}
private HibernateTemplate hibernateTemplate;
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.hibernateTemplate = new HibernateTemplate(sessionFactory);
}
public void Save(User s){
this.hibernateTemplate.save(s);
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration (locations = {"classpath:**/spring-servlet.xml"})
@DependsOn("UserDAO")
@Transactional
@Configuration
public class UserDAOTest extends AbstractTransactionalDataSourceSpringContextTests {
@Autowired
private UserDAO userDAO;
@Autowired
private SessionFactory sessionFactory;
public UserDAO getUserDAO() {
return userDAO;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Test
public void testSave() {
User spr = new User();
spr.setKzId(0);
spr.setOpis("User test");
spr.setPlan("Plan test");
spr.setPolrocze(1);
spr.setPrognoza1("test1");
spr.setPrognoza2("test2");
spr.setRok(2000);
userDAO.Save(spr);
User spr2 = userDAO.GetUserById(spr.getId());
Assert.assertEquals("User test", spr2.getOpis());
}
}
这是我的spring-servlet.xml。注意,我没有编写任何类似“userDAO”的bean:
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
(...)
<context:annotation-config />
<tx:annotation-driven transaction-manager="txManager" />
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="jspViewResolver"
(...)
</bean>
<bean id="pdfViewResolver" class="org.springframework.web.servlet.view.XmlViewResolver">
(...)
</bean>
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean class="org.springframework.jmx.export.MBeanExporter">
<property name="autodetect" value="false" />
<property name="assembler">
<bean id="jmxAssembler"
class="org.springframework.jmx.export.assembler.MetadataMBeanInfoAssembler">
<property name="attributeSource">
<bean
class="org.springframework.jmx.export.annotation.AnnotationJmxAttributeSource" />
</property>
</bean>
</property>
</bean>
<context:component-scan base-package="pl.edm.taskcards.spring" />
<context:component-scan base-package="pl.raban.resource.spring" />
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource"
p:basename="messages" />
<bean id="openSessionInViewInterceptor"
class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
(...)
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan">
<list>
<value>pl.edm.taskcards.spring</value>
<value>pl.raban.resource.spring</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.connection.useUnicode">true</prop>
<prop key="hibernate.connection.characterEncoding">UTF-8</prop>
<prop key="hibernate.jdbc.batch_size">0</prop>
<prop key="hibernate.query.substitutions">true 1, false 0</prop>
</props>
</property>
</bean>
<tx:annotation-driven />
</beans>
但在我运行此测试后,出现了错误:
您需要为UserDao类声明一个bean。您需要为UserDao类声明一个bean。我认为您在这里混淆了一些机制。@Configuration类提供bean,但不应该是bean本身 使用@Component直接创建bean,或者将@Configuration注释放在另一个类上 了解更多有关概念的信息: a b 但是它应该仍然有效,即使你混淆了概念 然而,问题应该在这里:
@ContextConfiguration (locations = {
"file:/src/main/webapp/WEB-INF/spring-servlet.xml"})
两个问题:
A.
b如果您的spring上下文在WEB-INF中,则它不在类路径上,因此无法通过类路径找到:*/spring-servlet.xml。我不知道在单元/集成测试中访问这样一个上下文的标准方法是什么,但我会尝试以下方法:
@Transactional
@Configuration
public class UserDAO {
@Bean
public UserDAO userDAO()
{
return new UserDAO();
}
private HibernateTemplate hibernateTemplate;
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.hibernateTemplate = new HibernateTemplate(sessionFactory);
}
public void Save(User s){
this.hibernateTemplate.save(s);
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration (locations = {"classpath:**/spring-servlet.xml"})
@DependsOn("UserDAO")
@Transactional
@Configuration
public class UserDAOTest extends AbstractTransactionalDataSourceSpringContextTests {
@Autowired
private UserDAO userDAO;
@Autowired
private SessionFactory sessionFactory;
public UserDAO getUserDAO() {
return userDAO;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Test
public void testSave() {
User spr = new User();
spr.setKzId(0);
spr.setOpis("User test");
spr.setPlan("Plan test");
spr.setPolrocze(1);
spr.setPrognoza1("test1");
spr.setPrognoza2("test2");
spr.setRok(2000);
userDAO.Save(spr);
User spr2 = userDAO.GetUserById(spr.getId());
Assert.assertEquals("User test", spr2.getOpis());
}
}
请参见我认为您在这里混淆了一些机制。@Configuration类提供bean,但不应该是bean本身 使用@Component直接创建bean,或者将@Configuration注释放在另一个类上 了解更多有关概念的信息: a b 但是它应该仍然有效,即使你混淆了概念 然而,问题应该在这里:
@ContextConfiguration (locations = {
"file:/src/main/webapp/WEB-INF/spring-servlet.xml"})
两个问题:
A.
b如果您的spring上下文在WEB-INF中,则它不在类路径上,因此无法通过类路径找到:*/spring-servlet.xml。我不知道在单元/集成测试中访问这样一个上下文的标准方法是什么,但我会尝试以下方法:
@Transactional
@Configuration
public class UserDAO {
@Bean
public UserDAO userDAO()
{
return new UserDAO();
}
private HibernateTemplate hibernateTemplate;
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.hibernateTemplate = new HibernateTemplate(sessionFactory);
}
public void Save(User s){
this.hibernateTemplate.save(s);
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration (locations = {"classpath:**/spring-servlet.xml"})
@DependsOn("UserDAO")
@Transactional
@Configuration
public class UserDAOTest extends AbstractTransactionalDataSourceSpringContextTests {
@Autowired
private UserDAO userDAO;
@Autowired
private SessionFactory sessionFactory;
public UserDAO getUserDAO() {
return userDAO;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Test
public void testSave() {
User spr = new User();
spr.setKzId(0);
spr.setOpis("User test");
spr.setPlan("Plan test");
spr.setPolrocze(1);
spr.setPrognoza1("test1");
spr.setPrognoza2("test2");
spr.setRok(2000);
userDAO.Save(spr);
User spr2 = userDAO.GetUserById(spr.getId());
Assert.assertEquals("User test", spr2.getOpis());
}
}
请参见spring-servlet.xml文件在哪里?我猜它在WEB-INF下,如果是这样,您就不能使用classpath加载它:正如您在测试类中所做的那样?spring-servlet.xml文件在哪里?我猜它在WEB-INF下,如果是这样的话,您就不能像在测试类中那样使用classpath加载它?您的意思是在我的spring-servlet.xml中编写bean吗?这是唯一的办法吗?是的。是的,据我所知。你的意思是在我的spring-servlet.xml中编写bean吗?这是唯一的办法吗?是的。据我所知,是的。xml中有一个组件扫描,它应该选择UserDAO-配置是一种组件,所以组件扫描会选择它。@gkamal你说得对。虽然这是丑陋的地狱,我认为问题在于其他地方看到我的更新。哦,我刚才看到你得出了同样的结论+我遇到了同样的问题。奇怪的是,spring一开始就不会抱怨通配符……xml中有一个组件扫描,它应该选择UserDAO——配置是一种组件,所以组件扫描会选择它。@gkamal你说得对。虽然这是丑陋的地狱,我认为问题在于其他地方看到我的更新。哦,我刚才看到你得出了同样的结论+我遇到了同样的问题。奇怪的是,spring一开始根本不会抱怨通配符。。。