SSM框架学习——单元测试类

说起这个单元测试类,我真是感受到自己菜得扣脚。之前一直以为来个@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.servletgroupId>
            <artifactId>javax.servlet-apiartifactId>
            <version>3.0.1version>
            <scope>providedscope>
        dependency>
        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.12version>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-testartifactId>
            <version>5.0.2.RELEASEversion>
        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(){

		//你的测试代码
    }
}

你可能感兴趣的:(SSM)