说起这个单元测试类,我真是感受到自己菜得扣脚。之前一直以为来个@Test就行了,没想到今天测试hibernate validator时,报了一个错误:No qualifying bean of type ‘javax.servlet.http.HttpServletRequest’
1. 问题背景
原因如下,我在业务层使用了@Autowire来注入HttpServletRequest。经过查看别人的博客,发现原因是我写的测试类只读取了spring和springmvc的配置文件,没有servlet的相关配置,所以不能使用@Autowire来注入HttpServletRequest。
@Resource
private UserInfoService userInfoService;
@Resource
private HttpServletRequest request;
2.解决问题和原因分析
解决办法时是:在测试类上加上@WebAppConfiguration注解
@WebAppConfiguration注解的作用是更改资源的加载方式,即从src / main / webapp或@WebAppConfiguration的value参数指定的位置加载,而不是classpath。
如果没有@WebAppConfiguration注解,那些非classpath下的配置在Spring上下文中不可用,因为通常classpath不包含webapp文件夹
3. 具体代码
测试类的需要的依赖要注意版本问题
使用@RunWith(SpringJUnit4ClassRunner.class)的话,junit版本不低于4.12
servlet倒不是测试类的依赖,只是想说版本不能低于3.0,否则会报错java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml","classpath:springmvc.xml"})
@WebAppConfiguration
public class TestSpring {
//直接注入
@Resource(name = "validator")
LocalValidatorFactoryBean validatorFactoryBean;
@Test
public void run(){
//你的测试代码
}
}