编程学习笔记

SpringBoot unit单元测试中无法自动注入RedisC

2019-04-18  本文已影响0人  烛火的咆哮

最终也没有直接解决的一个问题,记录下来

导包版本

pom中皆为自动版本

代码

configuration
@Configuration
public class RedisConfig {
    @Bean
    public RedisConnectionFactory redisCF(){
        //如果什么参数都不设置,默认连接本地6379端口
        JedisConnectionFactory factory = new JedisConnectionFactory();
        return factory;
    }
}
test
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
public class RedisTest {

    //  ↓始终无效
    @Autowired
    RedisConnectionFactory factory;
    @Test
    public void testRedis(){
        //得到一个连接
        RedisConnection conn = factory.getConnection();
        conn.set("hello".getBytes(), "world".getBytes());
        System.out.println(new String(conn.get("hello".getBytes())));
    }

}
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.example.learn_1.config.RedisTest': Unsatisfied dependency expressed through field 'factory'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.data.redis.connection.RedisConnectionFactory' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
  1. 忽略,idea有时可能抽风
  2. 将@Autowired改为@Resource

解决

pom文件中导入clients
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
注意添加@SpringBootTest(classes = Application.class)注解
  1. 较高版本的spingboot中,test使用该注解需要添加括号内的值,这样才能保证注入成功
注意目录结构
目录结构.png
  1. springboot只会扫描启动类(Application)当前所在目录以及其子目录的文件,保证自己的@Configuration注解的类都在启动类之下
  2. 注意test中的目录结构,最好与上方一一对应

曲线救国

借助AnnotationConfigApplicationContext类来获取spring应用上下文 通过getBean()方法获取需要的bean

代码如下:

public class RedisTest {

    @Test
    public void testRedis(){
        //得到一个连接
        // 以注解的形式把 bean 注入Spring 并获取 Spring 的上下文环境
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(RedisConfig.class);
        // 获取自己配置的 bean 实例
        RedisConnectionFactory factory = ctx.getBean(RedisConnectionFactory.class);

        RedisConnection conn = factory.getConnection();
        conn.set("hello".getBytes(), "world".getBytes());
        System.out.println(new String(conn.get("hello".getBytes())));
    }

}

总结

  1. 待补充
  2. 第一时间会考虑到导包问题/注解问题/设置问题/目录问题等环境条件出错,毕竟毫无内容
  3. 在解决之前需要先通过controller中接口以及config类中的断点,确认RedisConnectionFactory 能够正常使用
上一篇 下一篇

猜你喜欢

热点阅读