• 【Spring】Junit加载Spring容器作单元测试(整理)


    原文地址:https://www.cnblogs.com/swugogo/p/5908435.html

    阅读目录

    > 引入相关Jar包

    一、均需引入所需的包

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>3.2.10.RELEASE</version>
    </dependency>

    >配置文件加载方式

    (a)加载配置文件<原始的手动加载方式>

    ApplicationContext context = new FileSystemXmlApplicationContext("WebRoot/WEB-INF/applicationContext.xml");
    new ClassPathXmlApplicationContext("applicationContext.xml");// 从classpath中加载
    new FileSystemXmlApplicationContext("classpath:地址");// 没有classpath表示当前目录 

    (b)注解的方式自动加载方式

     @org.springframework.test.context.ContextConfiguration(locations={"file:WebRoot/WEB-INF/applicationContext.xml"})
     
     @org.springframework.test.context.ContextConfiguration(locations={"classpath:applicationContext.xml"}) 
     @RunWith(SpringJUnit4ClassRunner.class)  //使用junit4进行测试  
        @ContextConfiguration   
        ({"/spring/app*.xml","/spring/service/app*.xml"}) //加载配置文件  
          
        //------------如果加入以下代码,所有继承该类的测试类都会遵循该配置,也可以不加,在测试类的方法上///控制事务,参见下一个实例  
        //这个非常关键,如果不加入这个注解配置,事务控制就会完全失效!  
        //@Transactional  
        //这里的事务关联到配置文件中的事务控制器(transactionManager = "transactionManager"),同时//指定自动回滚(defaultRollback = true)。这样做操作的数据才不会污染数据库!  
        //@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)  
        //------------  
        public class BaseJunit4Test {  
        }  

    >原始的用法

    测试类中要设置加载哪些Spring的配置(我这里是“/config/application*.xml”),然后就可以注入容器中的bean了。这里列举用注解的方式

    package com.nicchagil.mybatis3spring3intg.junit;
    
    import java.util.List;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import com.nicchagil.mybatis3spring3intg.bean.User;
    import com.nicchagil.mybatis3spring3intg.service.UserService;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration({"/config/application*.xml"})
    public class JunitTest {
        
        @Autowired
        private UserService userService;
        
        @Test
        public void c1() {
            List<User> userList = userService.query(new User());
            System.out.println(userList);
        }
    
    }

    在具体的测试类中,采用手动加载配置文件的方式进行JUnit测试,有如下缺点

    1)导致多次Spring容器初始化问题

    2)需要使用硬编码方式手工获取Bean ,需要强制转换

    3)数据库现场容易遭受破坏(理想的状态:自动回滚对数据库的操作,保证数据库的现场不被破坏,因此重复测试不会发生问题)

    4)不方便对数据操作正确性进行检查(理想状态:过jdbcTemplate在同一事务中访问数据库,查询数据的变化,验证操作的正确性)

    > 常见的用法

    常用的方式是将加载配置的部分公用出来:

    package com.nicchagil.mybatis3spring3intg.junit;
    
    import org.junit.runner.RunWith;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration({"/config/application*.xml"})
    public class BaseJunit {
        
    }

    然后需要的各个测试类继承公用类:

    package com.nicchagil.mybatis3spring3intg.junit;
    
    import java.util.List;
    
    import org.junit.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    
    import com.nicchagil.mybatis3spring3intg.bean.User;
    import com.nicchagil.mybatis3spring3intg.service.UserService;
    
    public class UserServiceTest extends BaseJunit {
        
        @Autowired
        private UserService userService;
      @Resource //自动注入,默认按名称  
      private IBaseDao baseDao; 
    
      @Test //标明是测试方法  
      @Transactional //标明此方法需使用事务  
      @Rollback(false) //标明使用完此方法后事务不回滚,true时为回滚  
      public void c1() { 
        List<User> userList = userService.query(new User()); 
        System.out.println(userList); 
      } 
    }
    //复习:@Autowired & @Resource 的区别
    //@Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下: 
    //    @Autowired  @Qualifier("personDaoBean") 
    //    private PersonDao  personDao; 
    
    //@Resource注解和@Autowired一样,也可以标注在字段或属性的setter方法上,但它默认按名称装配。名称可以通过@Resource的name属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。 
    //    @Resource(name=“personDaoBean”) 
    //    private PersonDao  personDao;//用于字段上 
    
    //注意:如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。 

    举例:

    工具类:RestClientUtil.java
    package com.kszsa.common.rest;
    
    import org.springframework.stereotype.Component;
    import org.springframework.web.client.RestTemplate;
    
    import java.util.Map;
    
    @Component
    public class RestClientUtil {
        /**
         * 调用远程Rest接口
         * @param url
         * @param classType
         * @param params
         * @param <T>
         * @return
         */
        public <T> T get(String url, Class<T> classType, Map<String,Object> params){
            RestTemplate restTemplate = new RestTemplate();
            return restTemplate.getForObject(url, classType, params);
        }
    }

    测试类

    RestClientUtilTest.java
    package com.kszsa.common.rest;
    
    import com.alibaba.fastjson.JSONObject;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import java.util.HashMap;
    import java.util.Map;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"classpath*:/*.xml"})
    public class RestClientUtilTest {
        @Autowired
        private RestClientUtil restClientUtil;
    
        @Test
        public void get(){
            String url = "http://localhost:8080/ssht/user/get?id={id}";
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("id",2);
            JSONObject jsonObject = restClientUtil.get(url, JSONObject.class, map);
            System.out.println(jsonObject);
        }
    
    
    }

     源码地址:https://gitee.com/kszsa/ssht.git

  • 相关阅读:
    推荐一个css抖动库
    八佰
    如何将猫猫监控放在博客上
    一个springboot注解不成功的小问题
    vue整理
    springboot整理
    国外服务器:org.xml.sax.SAXParseException
    记一次tomcat运行起来了但是项目没起来的问题
    一个狗血的mysql编码错误
    js中for(var key in o ){};用法小记
  • 原文地址:https://www.cnblogs.com/dyh004/p/11584110.html
Copyright © 2020-2023  润新知