Spring boot 结合Mockito、junit、MockMVC

1.Junit Assertions

class:org.junit.jupiter.api.Assertions

方法名描述
assertEquals断言结果值和预期结果是否相等
assertNotEquals断言结果值和预期结果是否不相等
assertNull断言结果值是否为空
assertNotNull断言结果值是否不为空

例如:Assertions.assertEquals(expected, actual);

方法名描述
assertSame断言是否是相同的对象
assertNotSame断言是否是不想等的对象
方法名描述
assertTrue断言是否是真
assertNotTrue断言是否是假
方法名描述
assertArraysEquals断言期望的数组和结果数组是否相等
方法名描述
assertThrows断言异常是否是所期望的

例如
notFound异常:
NotFoundException exception = assertThrows(NotFoundException .class, () -> xxx.方法名());

2. 生命周期方法注解

注解描述
@BeforEach该注解下的方法,在每个测试执行前都会先执行
@AfterEach该注解下的方法,在每个测试执行后都会先执行
@BeforeAll该注解下的方法,在所有测试执行前会执行一次
@AfterAll该注解下的方法,在所有测试执行后会执行一次

执行顺序:
@BeforeAll ----->@BeforeEach----->@Test 方法一------>@AfterEach--------->@BeforeEach----->@Test 方法二------>@AfterEach------->@AfterAll

3. @DisplayName

给测试添加运行时展示的名字

4. 测试方法的执行顺序排序注解

@Order 给方法加上排序的优先级
在这里插入图片描述

@TestMethodOrder

指定方法的顺序:

名字描述
MethodOrderer.DisplayName根据displayName的测试名字进行方法的排序
MethodOrderer.MethodName根据方法名进行方法的排序
MethodOrderer.Random根据方法名随机排序
MethodOrderer.OrderAnnotation根据@Order注解进行排序

在这里插入图片描述

5. 条件测试

名字描述
@Disabled该注解下的测试方法都不会被运行,会被忽略
@EnabledOnOs该注解下的测试只能运行在给定的操作系统下,非给定的操作系统下会被忽略运行

6. Parameterized Tests

用参数化测试的时候要将@Test注解换成@ParameterizedTest,使用以下注解给方法注入自己想要的入参。

注解描述
@ValueSource数组:字符串数组,整数数组,double数组,float数组等
@CsvSourcecsv字符串值数组
@CsvFileSource从文件中读取CSV值
@EnumSource枚举类型的值
@MethodSource提供值的自定义方法

6.1 @EnumSource

(1)测试方法上添加

@EnumSource(value = xxx.class, names = {“A”, “B”} )  

A和B是xxx.class类中的值,也是测试方法的入参
(2)在测试方法上添加@ParameterizedTest,而不是使用通常的@Test
(3)写测试方法,xxx为EnumSource中定义的类

	void 方法名(xxx name){
	
	}  

6.2 @CsvSource

(1)测试方法上添加

@CsvSource(“A,B” )  A和B是是测试方法的入参

(2)在测试方法上添加@ParameterizedTest,而不是使用通常的@Test

(3)写测试方法,name为CsvSource中定义的类

void 方法名(String name){
}  

6.2 @ValueSource

(1)测试方法上添加

@ValueSource(booleans = {true, false})  booleans 是入参的类型,其实还有strings chars等

(2)在测试方法上添加@ParameterizedTest,而不是使用通常的@Test

(3)写测试方法,name为ValueSource中定义的类

void 方法名(Boolean name){
}  

7. 基于Spring boot的单元测试

(1)需要引入spring boot测试的依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

(2)在测试中注入被测方法

@SpringBootTest
class UserServiceApplicationTests {

    @InjectMocks
    private UserServiceImpl service;
    
    @Test
    void contextLoads() {

    }

}

(3)使用Mockito,设置测试替身

@SpringBootTest
class UserServiceApplicationTests {

    @InjectMocks
    private UserServiceImpl service;
    
    @Mock
    private UserRepositoryImpl repository;

    @Test
    void contextLoads() {

    }

}

(4)设置测试替身希望能得到的结果

class UserServiceApplicationTests {

    @InjectMocks
    private UserServiceImpl service;

    @Mock
    private UserRepositoryImpl repository;

    @Test
    void contextLoads() {
        when(repository.findById(any()))
                .thenReturn(User.builder()
                        .id("11")
                        .name("qwx")
                        .age(18)
                        .build());
    }

}

(5) 调用被测方法,对比期望的值和被测方法返回的值是否相等

@SpringBootTest
class UserServiceApplicationTests {

    @InjectMocks
    private UserServiceImpl service;

    @Mock
    private UserRepositoryImpl repository;

    @Test
    void contextLoads() {
        when(repository.findById(any()))
                .thenReturn(User.builder()
                        .id("11")
                        .name("qwx")
                        .age(18)
                        .build());

        UserResponseDTO userResponseDTO = service.findUserById(any());

        assertEquals("11", userResponseDTO.getId());
        assertEquals("qwx", userResponseDTO.getName());
    }

}

8. ReflectionTestUtils

调用私有方法:

// 假设有一个类名为MyClass,其中包含一个私有方法privateMethod()
Object obj = new MyClass();
ReflectionTestUtils.invokeMethod(obj, "privateMethod", arg1, arg2);

设置私有字段的值:

// 假设有一个类名为MyClass,其中包含一个私有字段privateField
Object obj = new MyClass();
ReflectionTestUtils.setField(obj, "privateField", value);

获取私有字段的值:

// 假设有一个类名为MyClass,其中包含一个私有字段privateField
Object obj = new MyClass();
Object fieldValue = ReflectionTestUtils.getField(obj, "privateField");

设置私有静态字段的值:

// 假设有一个类名为MyClass,其中包含一个私有静态字段privateStaticField
ReflectionTestUtils.setField(MyClass.class, "privateStaticField", value);

9. 集成测试

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值