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)}
- 尝试过的解决方法
- 忽略,idea有时可能抽风
- 将@Autowired改为@Resource
解决
pom文件中导入clients
- pom如下
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
注意添加@SpringBootTest(classes = Application.class)注解
- 较高版本的spingboot中,test使用该注解需要添加括号内的值,这样才能保证注入成功
注意目录结构
目录结构.png- springboot只会扫描启动类(Application)当前所在目录以及其子目录的文件,保证自己的@Configuration注解的类都在启动类之下
- 注意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())));
}
}
- 通过该方式,只要容器中存在对应类型的bean,即可获取到实例
总结
- 待补充
- 第一时间会考虑到导包问题/注解问题/设置问题/目录问题等环境条件出错,毕竟毫无内容
- 在解决之前需要先通过controller中接口以及config类中的断点,确认RedisConnectionFactory 能够正常使用