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 &lt;context:annotation-drivern/&gt; 怎么样?你有你的 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.2Hibernate 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*:**/&lt;context&gt;.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 注入失败

单元测试怎么注入service

Junit问题01 利用 @Autowired 注入失效问题

如何使用 SpringBoot2、JUnit5 和 Kotlin 将配置属性注入单元测试

Springboot单元测试调用Service或Dao方法出现空指针异常

Springboot单元测试调用Service或Dao方法出现空指针异常