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 的。

你可能感兴趣的:(开发工具,spring,java,spring,boot)