Junit单元测试自动注入失败
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Junit单元测试自动注入失败相关的知识,希望对你有一定的参考价值。
参考技术A 使用@Autowired()注解,改为@Autowired(required=false)单元测试下,注入request、response、session 失败
加@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring-service.xml")
只加载service层、dao层扫描的配置,多个配置文件以逗号分隔
方法上添加@Test()
public void test()
System.out.print("sdfaf");
Spring 不使用 JUnit 在单元测试中自动装配
【中文标题】Spring 不使用 JUnit 在单元测试中自动装配【英文标题】:Spring not autowiring in unit tests with JUnit 【发布时间】:2013-07-11 12:20:47 【问题描述】:我用 JUnit 测试了以下 DAO:
@Repository
public class MyDao
@Autowired
private SessionFactory sessionFactory;
// Other stuff here
如您所见,sessionFactory 是使用 Spring 自动装配的。当我运行测试时,sessionFactory 仍然为空,并且我得到一个空指针异常。
这是 Spring 中的 sessionFactory 配置:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
<property name="configurationClass">
<value>org.hibernate.cfg.AnnotationConfiguration</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">$jdbc.dialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
怎么了?如何也为单元测试启用自动装配?
更新:我不知道这是否是运行 JUnit 测试的唯一方法,但请注意,我在 Eclipse 中运行它,右键单击测试文件并选择“运行方式”->“JUnit 测试”
【问题讨论】:
扫描路径中是否包含MyDao
?
<context:annotation-drivern/>
怎么样?你有你的 XML 文件吗?
我有 来自这个命名空间 xmlns:tx="springframework.org/schema/tx"
【参考方案1】:
将这样的内容添加到您的根单元测试类中:
@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration
这将使用默认路径中的 XML。如果您需要指定非默认路径,则可以为 ContextConfiguration 注释提供位置属性。
http://static.springsource.org/spring/docs/2.5.6/reference/testing.html
【讨论】:
我看不到并包含这些注释 好的,我只需要在 pom 中添加一些东西就可以使用注释。现在我添加了它们,我得到了这个错误: java.lang.IllegalStateException: GenericXmlContextLoader 和 AnnotationConfigContextLoader 都无法检测到默认值,并且没有为上下文配置声明 ApplicationContextInitializers [ContextConfigurationAttributes@1dd58d8 declaringClass = 'org.davis.dao.EmployeeDAOImplTest',位置 = '',类 = '',inheritLocations = true,初始化程序 = '',inheritInitializers = true,名称 = [null],contextLoaderClass = 'org.springframework.t... 对,将位置属性添加到您的 ContextConfiguration 注释中,并根据我给您的 spring 文档提供 XML 文件的路径。 我试过这个,对吗? @ContextConfiguration(locations="/WEB-INF/spring-servlet.xml") 我不能告诉你它是否正确。对于我的项目,我将其指定为:locations = "classpath:/META-INF/spring/applicationContext.xml"【参考方案2】:我在使用 Spring Boot 2.1.1 和 JUnit 4 时遇到了同样的问题 刚刚添加了这些注释:
@RunWith( SpringRunner.class )
@SpringBootTest
一切顺利。
对于 Junit 5:
@ExtendWith(SpringExtension.class)
source
【讨论】:
仍然为空【参考方案3】:我使用的是 JUnit 5,对我来说,问题是我从错误的包中导入了 Test
:
import org.junit.Test;
用以下内容替换它对我有用:
import org.junit.jupiter.api.Test;
【讨论】:
【参考方案4】:您需要使用 Spring JUnit 运行器才能从您的上下文中连接 Spring bean。下面的代码假定您在测试类路径上有一个名为 testContest.xml
的应用程序上下文。
import org.hibernate.SessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
import java.sql.SQLException;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.startsWith;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath*:**/testContext.xml")
@Transactional
public class someDaoTest
@Autowired
protected SessionFactory sessionFactory;
@Test
public void testDBSourceIsCorrect() throws SQLException
String databaseProductName = sessionFactory.getCurrentSession()
.connection()
.getMetaData()
.getDatabaseProductName();
assertThat("Test container is pointing at the wrong DB.", databaseProductName, startsWith("HSQL"));
注意:这适用于 Spring 2.5.2 和 Hibernate 3.6.5
【讨论】:
问题在于理解正确的使用路径。我在 src/main/webapp/WEB-INF/spring-servlet.xml 下有我的 servlet-context.xml,我正在使用这个位置:@ContextConfiguration(locations = "classpath:spring-servlet.xml") 但是这不起作用。我应该写什么? @user1883212 试试@ContextConfiguration(locations = "classpath*:**/servlet-context.xml" )
@user1883212 使用classpath*:**/<context>.xml
将在您的类路径中的任何位置搜索上下文。您的 bean 是在您的上下文中还是在 servlet 中定义的?【参考方案5】:
配置中缺少上下文文件位置可能会导致此问题,解决此问题的一种方法:
在 ContextConfiguration 中指定 Context 文件位置喜欢:
@ContextConfiguration(locations = "classpath:META-INF/your-spring-context.xml" )
更多细节
@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration(locations = "classpath:META-INF/your-spring-context.xml" )
public class UserServiceTest extends AbstractJUnit4SpringContextTests
参考:Thanks to @Xstian
【讨论】:
【参考方案6】:你需要给 Junit 类添加注解,告诉它使用 SpringJunitRunner。你想要的是:
@ContextConfiguration("/test-context.xml")
@RunWith(SpringJUnit4ClassRunner.class)
这告诉 Junit 使用与测试相同目录中的 test-context.xml 文件。这个文件应该和你在 spring 中使用的真正的 context.xml 类似,但是自然会指向测试资源。
【讨论】:
【参考方案7】:我也遇到了这个问题,原因是 @Test
的导入无效删除导入
import org.junit.Test;
并使用
import org.junit.jupiter.api.Test;
【讨论】:
以上是关于Junit单元测试自动注入失败的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot + Junit 踩坑:部分 Service 注入失败
Junit问题01 利用 @Autowired 注入失效问题
如何使用 SpringBoot2、JUnit5 和 Kotlin 将配置属性注入单元测试