springboot使用Mockito和Junit进行测试代码编写

摘要

“Mockito + junit + springboot” 搞定UT用例的复杂场景数据模拟

一、背景分析

  • 目前主流的junit框架是junit4 和junit5,junit4的好处是资料和搭配使用的模块目前较多,junit5的优点是使用起来更加方便更加友好

  • 在编写UT数据模拟这块junit的功能明显是不足的,因此我们常常还需要跟Mockito进行搭配,覆盖我们java项目开发的一些常见的场景(本文以目前主流开发的springboot场景进行讲解)

  • SpringBoot1.X版本默认使用的Junit4.X的版本,而SpringBoot2.X版本默认使用的junit5.X,说明主流的搭配也该如此,因此建议大家升级到springboot2.X也升级一下junit,短期方案可以在pom文件中指定junit使用版本为4.X

本文将对springboot1.X+junit4和springboot2.X+junit5这两种场景进行展开介绍,文章末尾附带代码链接

二、springboot1.X+junit4

pom

spring-boot-starter-test 中默认集成了Mockito,则不需要额外引入。非springboot项目则引入方式如下:

<dependency>
	<groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>
<dependency>
	<groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>1.10.19</version>
</dependency>

code

针对Springboot1.X的情况,mockito需要添加@RunWith(MockitoJUnitRunner.class)

如果使用的Junit + mockito联合测试,那应该使用的@RunWith(SpringJunit4ClassRunner.class), 这时候需要再添加mockito的初始化(可通过@Run public MockitoRule mockitoRule = MockitoJunit.rule();实现), 两种场景如下代码

package com.dreamkite.pg.controller;

@ActiveProfiles({"test"})
@SpringBootTest(classes = {MockitoJUnitRunner.class})
@RunWIth(SpringJunit4ClassRunner.class)
class AControllerTest {
    @Autowired
    @InjectMocks
    private AController aController;

    @Mock
    private PersonService personService;

    @Test
    void hi() {
        Mockito.doReturn("hjk").when(personService).hi();

        Assert.assert("hjk", aController.hi());
    }
}

第二种会启动springboot服务

package com.dreamkite.pg.controller;

@ActiveProfiles({"test"})
@SpringBootTest(classes = {UsePgApplication.class})
@RunWIth(SpringJunit4ClassRunner.class)
class AControllerTest {
    @Run 
    public MockitoRule mockitoRule = MockitoJunit.rule();

    @Autowired
    @InjectMocks
    private AController aController;

    @Mock
    private PersonService personService;

    @Test
    void hi() {
        Mockito.doReturn("hjk").when(personService).hi();

        Assert.assert("hjk", aController.hi());
    }
}

代码补充说明:

@Mock创建的全部mock的对象,即在对具体的方法打桩前,mock对象的所有属性和方法全部置为空(0或null);

@injectMocks创建的对象,其内部的对象没有被@Mock进行注解的对象则为0或null,如果需要injectMocks注解的对象除了装配Mock的对象,其他内部对象能自动装配,则要跟@Autowired一起使用。

三、springboot2.X+junit5

junit5与junit4区别比较大,junit5使用了大量的jdk8特性、lamda表达式。

pom

spring-boot-starter-test 中默认集成了Mockito,则不需要额外引入。非springboot项目则引入方式如下:

<dependency>
	<groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>5.3.1</version>
    <scope>test</scope>
</dependency>
<dependency>
	<groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>2.21.0</version>
    <scope>test</scope>
</dependency>

Code

package com.dreamkite.pg.controller;

import com.dreamkite.pg.UsePgApplication;
import com.dreamkite.pg.service.PersonService;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit.jupiter.SpringExtension;

import static org.junit.jupiter.api.Assertions.*;

@ActiveProfiles({"test"})
@SpringBootTest(classes = {UsePgApplication.class})
@ExtendWith(SpringExtension.class)
@ExtendWith({MockitoExtension.class})
class AControllerTest {

    @Autowired
    @InjectMocks
    private AController aController;

    @Mock
    private PersonService personService;

    @Test
    void hi() {
        Mockito.doReturn("hjk").when(personService).hi();
        
        assertEquals("hjk", aController.hi());
    }
}

见github链接:https://github.com/junkaitongxue/LearnSpringBoot/blob/main/usePostgres/src/test/java/com/dreamkite/pg/controller/AControllerTest.java

四、相关链接:

(以上内容为DreamKite本人原创,转载请附上原文链接)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Boot是一个用于构建Java应用程序的开源框架,它提供了一种简化了配置的方式来快速构建应用程序。JUnit是一个用于编写和运行单元测试的开源测试框架,而Mockito是一个用于创建和管理模拟对象的Java库。 下面是一个使用Spring BootJUnitMockito进行单元测试的示例: 假设我们有一个UserService类,它依赖于一个UserRepository接口来访问数据库并进行一些操作。我们想要对UserService的方法进行单元测试。 首先,我们需要创建一个测试类,命名为UserServiceTest。在测试类中,我们将使用JUnit的注解来标记测试方法,并使用Mockito来创建模拟对象。示例代码如下: ```java @RunWith(MockitoJUnitRunner.class) public class UserServiceTest { @InjectMocks private UserService userService; @Mock private UserRepository userRepository; @Test public void testGetUserById() { // 配置模拟对象的行为 User user = new User("1", "John"); when(userRepository.findById("1")).thenReturn(user); // 调用被测试的方法 User result = userService.getUserById("1"); // 验证结果 assertEquals("John", result.getName()); } } ``` 在上面的示例中,我们使用了@RunWith注解来指定使用MockitoJUnitRunner运行测试,这样就能自动创建和管理模拟对象。使用@InjectMocks注解将被测试的对象自动注入到测试类中,使用@Mock注解创建模拟对象。 在testGetUserById方法中,我们首先使用when方法配置userRepository模拟对象的行为,表示当传入参数为"1"时,返回一个指定的User对象。 然后,我们通过调用userService的getUserById方法来测试该方法的逻辑。最后,使用assertEquals断言来验证结果是否符合预期。 以上就是一个使用Spring BootJUnitMockito进行单元测试的示例。通过使用Mockito创建模拟对象,我们可以更容易地测试各个方法的逻辑,而不依赖于实际的数据库。这样可以提高测试效率并确保代码的质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dream_Kite

你的鼓励,是我不断创作的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值