在学习redis的过程中,使用了spring提供的单元测试功能,但是出现了@Autowired不注入的问题,本篇博客主要说明了该问题出现的原因以及解决方法。
初始代码如下:
public class RedisTest01 {
private static final Logger log = LoggerFactory.getLogger(RedisTest01.class);
//redis模板组件
@Autowired
RedisTemplate redisTemplate;
@Autowired
StringRedisTemplate stringRedisTemplate;
@Test
public void test1(){
log.info("---字符串测试---");
final String key = "SpringBootRedis:Order:10011";
ValueOperations valueOperations = redisTemplate.opsForValue();
valueOperations.set(key,"10011");
}
}
运行后结果:
在IDEA的报错中显示了空指针的异常,原因是redisTemplate是一个空指针,但是在redisTemplate上不是已经标注了@Autowired
的注解了吗?
通过观察,我发现我没有标注这个测试类,spring无法知道我这个类是什么类,所以其实@Autowired
是不生效的。
解决方法:
在类上添加注解
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = MainApplication.class)
@runWith注解作用:
– @RunWith就是一个运行器
– @RunWith(JUnit4.class)就是指用JUnit4来运行
– @RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环 境,以便在测试开始的时候自动创建Spring的应用上下文
– @RunWith(Suite.class)的话就是一套测试集合
SpringTest与JUnit等其他测试框架结合起来,提供了便捷高效的测试手段。而SpringBootTest 是在SpringTest之上的再次封装,增加了切片测试,增强了mock能力。
综上:
springboot测试步骤
直接在测试类上面加上如下2个注解@RunWith(SpringRunner.class)
和@SpringBootTest
就能取到spring中的容器的实例,如果配置了@Autowired
那么就自动将对象注入。
再次运行,程序正常执行后结束。