51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 1171|回复: 1
打印 上一主题 下一主题

[转贴] 即使不懂单元测试,会用这个工具也够了~

[复制链接]
  • TA的每日心情
    无聊
    前天 09:06
  • 签到天数: 941 天

    连续签到: 3 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-1-17 13:13:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     Mockito学习
      Mockito是一个强大的用于Java开发的模拟测试框架,通过Mockito我们可以创建和配置Mock对象,进而简化有外部依赖的类的测试。可以不进行外部依赖,快速进行Java的单元测试的进行。

      Mock 模拟
      Mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。

      Mockito好处
      无手写 : 无需自己编写模拟对象。
      重构安全 : 重命名接口方法名称或重新排序参数不会破坏测试代码,因为Mocks是在运行时创建的。
      返回值支持 : 支持返回值。
      异常支持 : 支持例外。
      订单检查支持 : 支持检查方法调用的顺序。
      注释支持 : 支持使用注释创建模拟。

      Mockito集成
      引入依赖
    1. <dependency>
    2.             <groupId>org.mockito</groupId>
    3.             <artifactId>mockito-core</artifactId>
    4.             <version>3.3.3</version>
    5.             <scope>test</scope>
    6.         </dependency>
    复制代码
    Mockito的使用
      初始化
    @Before
        public void initMocks() {
            MockitoAnnotations.initMocks(this);
        }

    或者:

    1. //引入依赖
    2. @RunWith(MockitoJUnitRunner.class)
    3. public class MockitoTest {
    4. }
    复制代码
    注解
      @Mock
      用于模拟对象,有助于减少重复模拟对象。
      注意:@Mock注释始终与@RunWith注释一起使用。
      @RunWith
      这是一个类级别的注释,它用于保持测试干净并改善调试,它还会检测测试中可用的未使用的存根,并使用@Mock注释对模拟进行初始化。
      @InjectMocks
      它标记应在其上执行注入的字段或参数。
      @Captor
      它允许创建字段级参数捕获器,它与Mockito的verify()方法一起使用, 以获取调用方法时传递的值。
      @Spy
      允许创建部分模拟的对象,换句话说,它允许将现场实例快速包装在测试对象中。

      创建一个实例
    package com.example.sl.demospringboot;

    import com.example.sl.demospringboot.dao.UserMapper;
    import com.example.sl.demospringboot.model.User;
    import com.example.sl.demospringboot.service.UserService;
    import com.example.sl.demospringboot.service.UserServiceImpl;
    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.mockito.*;
    import org.mockito.junit.MockitoJUnitRunner;

    import java.util.List;
    import java.util.Map;

    import static org.mockito.Mockito.*;

    //引入依赖
    @RunWith(MockitoJUnitRunner.class)
    public class MockitoTest {

        //初始化Mokc注解对象或者@RunWith(MockitoJUnitRunner.class)
    //    @Before
    //    public void initMocks() {
    //        MockitoAnnotations.initMocks(this);
    //    }
        //模拟一个对象
        @Mock
        private Map map;


        @InjectMocks
        private UserServiceImpl userServicei;
        @Mock
        private UserService userService;

        @Mock
        private UserMapper userMapper;

        @Test
        public void test1(){
            User user=mock(User.class);
            when(user.getUsername()).thenReturn("快乐");
            //当调用user.getUsername()返回“快乐”
            Assert.assertEquals("快乐",user.getUsername());
            Assert.assertTrue(map instanceof Map);
            //当调用user.getUsername()抛空指针
            Mockito.doThrow(new NullPointerException()).when(user.getUsername());
            //当调用user的时候什么事情也不用做
            Mockito.doNothing().when(user);
            map.size();
            //verify检测方法调用,这表明size方法调用一次
            verify(map,times(1)).size();
        }
        /**
         * 捕获参数
         */
        @Test
        public  void  testGetParam(){
            String param="我是一个参数";
            //模拟一个List对象
            List listO=Mockito.mock(List.class);
            ArgumentCaptor<String> paramObject = ArgumentCaptor.forClass(String.class);//捕获参数的对象

            listO.add(param);//mock对象执行add方法,将test添加进其中

            verify(listO).add(paramObject.capture());//捕获参数

            Assert.assertEquals("我是一个参数", paramObject.getValue());//断言验证

        }
        /**
         * 模拟数据库查询一个User
         */
        @Test
        public void testGetUser(){
            User user=new User();
            user.setAge(1);
            //调用方法返回一个实体
            when(userServicei.findUser()).thenReturn(user);
           // System.out.println("userService.findUser().getAge() = " + userServicei.findUser().getAge());
            Assert.assertEquals("1",userServicei.findUser().getAge()+"");
            verify(userMapper).getUser();
        }
        /**
         * 调用接口发方法进行测试
         * 设置超时时间
         */
        @Test(timeout = 1000)
        public void testInterface() throws InterruptedException {
            User user=new User();
            user.setUsername("test");
            //调用userService.findUser()返回一个usaer
            when(userService.findUser()).thenReturn(user);
            Assert.assertEquals("test",userService.findUser().getUsername());
            //验证执行几次
            verify(userService).findUser();
        }
    }
    注意
      @InjectMocks创建一个实例,也就是一个包含注入接口或者其他bean的一个对象。
      @Mock是一个实例里面的一个注入对象,对应的是spring的一个bean。





    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-2 09:08 , Processed in 0.062965 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表