Spring Junit 使用时无法注入 Bean 的问题

Spring Junit 使用时无法注入 Bean 的问题

在使用 Junit 4 时,使用如下的测试方式来注入 DataSource Bean :

import org.junit.Test;
import org.junit.Before;
import org.apache.shiro.realm.jdbc.JdbcRealm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import javax.sql.DataSource;

@SpringBootTest
public class ShiroTest {
    @Autowired
    DataSource dataSource;
    
    JdbcRealm jdbcRealm = new JdbcRealm();
    
    // 在执行测试之前执行的相关行为
    @Before
    public void addDataSource() {
        jdbcRealm.setDataSource(dataSource);
    }
    
    @Test
    public void test() {
        System.out.println("dataSource={}", dataSource);
    }
}

此时注入到 ShiroTest 中的 DataSource Bean 为 null,这是由于 Junit 默认情况下不会加载 Spring 上下文环境,因此此时无法找到在 Spring 中存在的 DataSource Bean


为了解决这个问题,主要有以下两种解决方案:

  • 使得 Junit 加载 Spring 上下文,只需加入 @RunWith 来加载 Spring 上下文即可,具体代码如下所示:

    import org.junit.Test;
    import org.junit.Before;
    import org.junit.runner.RunWith;
    import org.apache.shiro.realm.jdbc.JdbcRealm;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import javax.sql.DataSource;
    
    @SpringBootTest
    @RunWith(SpringRunner.class)
    public class ShiroTest {
        @Autowired
        DataSource dataSource;
        
        JdbcRealm jdbcRealm = new JdbcRealm();
        
        @Before
        public void addDataSource() {
            jdbcRealm.setDataSource(dataSource);
        }
        
        @Test
        public void test() {
            System.out.println("dataSource={}", dataSource);
        }
    }
    

    通过加入 SpringRunner,即可使得 Junit 自动完成 Spring 上下文的加载

  • 将 Junit 4 升级到 Junit 5。Junit 5 是对 Junit 4 的一个重大改进,在 Junit 5 中已经将 Spring 上下文的加载整合了,因此不需要显式地添加 @RunWith 来加载 Spring 上下文。

    需要注意的是,Junit 5 的 API 相对于 Junit 4 来讲有许多的变动,具体可以参考对应的文档,上文的例子使用 Junit 5 来测试如下所示:

    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.apache.shiro.realm.jdbc.JdbcRealm;
    
    import javax.sql.DataSource;
    
    @SpringBootTest
    public class ShiroTest {
        @Autowired
        DataSource dataSource;
        
        JdbcRealm jdbcRealm = new JdbcRealm();
        
        @BeforeEach
        public void addDataSource() {
            jdbcRealm.setDataSource(dataSource);
        }
        
        @Test
        public void test() {
            System.out.println("dataSource={}", dataSource);
        }
    }
    

现在,在 ShiroTest 执行 test() 测试,会发现是存在对应的 DataSource Bean 的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JUnit是一个Java中非常流行的单元测试框架,通常用于对Java程序进行测试。在使用JUnit进行测试,我们可能会遇到一个问题,即无法获取到注入Bean。这个问题通常出现在Spring中,因为Spring框架在运行会自动进行依赖注入,而JUnit在运行测试并不会使用Spring框架。那么如何解决JUnit获取不到注入Bean的问题呢? 解决JUnit获取不到注入Bean的问题的方法有很多种,其中最常见的方法是使用SpringJUnit4ClassRunner这个类来运行JUnit测试。SpringJUnit4ClassRunner是JUnit的一个扩展类,它可以让JUnit在运行测试自动使用Spring框架进行依赖注入。 具体来说,我们需要在JUnit测试类上加上@RunWith注解,并将其值设置为SpringJUnit4ClassRunner.class。接下来,我们需要加上@ContextConfiguration注解,用来指定Spring配置文件的路径。这样,JUnit就可以自动加载Spring配置文件,并在运行测试使用Spring框架进行依赖注入了。 另外,我们也可以使用Mockito框架来解决JUnit获取不到注入Bean的问题。Mockito是一个Java中非常流行的单元测试框架,它可以让我们在测试模拟出一些对象,并将其注入到需要测试的对象中,从而解决依赖注入问题。 在使用Mockito进行测试,我们需要在测试类上加上@Mock和@InjectMocks注解。@Mock注解用来标识需要模拟出来的对象,而@InjectMocks注解则用来标识需要注入模拟对象的对象。 总之,在使用JUnit进行测试,我们应该注意依赖注入问题。通过使用SpringJUnit4ClassRunner和Mockito框架,我们可以轻松地解决JUnit获取不到注入Bean的问题,从而更加方便地进行单元测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值