SpringBoot+Junt+Mock测试方法

本文介绍Mock测试的基本概念及其应用场景,详细讲解如何使用Spring和Mockito框架进行Mock测试,并通过示例演示具体的实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Mock测试定义

Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取比较复杂的对象(如 JDBC 中的ResultSet 对象),用一个虚拟的对象(Mock 对象)来创建以便测试的测试方法。Mock 最大的功能是帮你把单元测试的耦合分解开,如果你的代码对另一个类或者接口有依赖,它能够帮你模拟这些依赖,并帮你验证所调用的依赖的行为

使用场景:

当一个方法中调用第三方服务(第三方接口、数据库操作等)不可用时,或者想要避开此方法的相关依赖,可以对这些第三方类或者依赖类mock掉,绕过(避开、屏蔽、跳过)这些类的方法,让其他服务正常运行,按我们规定的返回值进行处理

一个JUnit4的单元测试用例执行顺序为:

@BeforeClass -> @Before -> @Test -> @After -> @AfterClass;

 

二、使用方法

1.添加依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
</dependency>

2.使用方法

1)类上添加@RunWith注解,启动junt的SpringRunner

2)使用@InjectMocks注解,将所有的mock类注入到这个对象实例中,因为没有注入spring容器,必须要进行实例化

3)使用@Mock注解,mock一个对象,模拟它的功能,一般出现在@InjectMocks注解对象方法中,当使用@InjectMocks注解的对象方法时,只要出现@Mock声明的对象方法,全都执行虚拟方法,不进入具体实现,因此屏蔽掉了@Mock对象方法,不会影响到其他方法

Mock测试类实现方法

@RunWith(SpringRunner.class)
@Slf4j
public class UserServiceMockTest {
    @InjectMocks
    private UserService userService=new UserServiceImpl();
    @Mock
    private UserMapper userMapper;

    @Before
    public void setUserMapperMock(){
        log.info("进入到@Before方法:");
        //MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testUserServiceMock(){
        User user=new User();
        user.setId(2);
        user.setDescription("测试Mock");
        log.info("进入到@Test方法:");
        Mockito.when(userService.queryUserById(user)).thenReturn(user);
        log.info("Mock执行结果:{}",userService.testMock("END"));

    }

    @After
    public void testAfter(){
        log.info("进入到@After方法:");
    }
}

UserServiceImpl类中实现方法

    @Override
    public User queryUserById(User user) {
        testMock(user.getDescription());
        return userMapper.selectByPrimaryKey(user.getId());
    }

    @Override
    public String testMock(String str) {
        System.out.println(str);
        return str;
    }

3.输出结果

可以看到执行顺序是正确的,而且在UserServiceImpl类中,屏蔽掉了中queryUserById方法的userMapper相关方法,其他正常执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值