当前位置:   article > 正文

Spring boot 结合Mockito、junit、MockMVC_springboot 集成mockito

springboot 集成mockito

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”} )  
  • 1

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

	void 方法名(xxx name){
	
	}  
  • 1
  • 2
  • 3

6.2 @CsvSource

(1)测试方法上添加

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

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

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

void 方法名(String name){
}  
  • 1
  • 2

6.2 @ValueSource

(1)测试方法上添加

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

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

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

void 方法名(Boolean name){
}  
  • 1
  • 2

7. 基于Spring boot的单元测试

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

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

@SpringBootTest
class UserServiceApplicationTests {

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

    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

@SpringBootTest
class UserServiceApplicationTests {

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

    @Test
    void contextLoads() {

    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

(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());
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

(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());
    }

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

8. ReflectionTestUtils

调用私有方法:

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

设置私有字段的值:

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

获取私有字段的值:

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

设置私有静态字段的值:

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

9. 集成测试

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/366769?site
推荐阅读
相关标签
  

闽ICP备14008679号